P3117
列舉矩形上邊界和下邊界 \(i, j\),然後列舉每一列 \(y\),且必須當前列上有 \(h\) 牛,然後向右列舉直到遇到有 g 牛的列,更新最大值。注意要離散化一下座標,再處理一下二維字首和,時間複雜度 \(O(n^3)\)。
P3118
狀壓dp,設 \(f_i\) 表示當前集合為 \(i\) 時,要連續看多久電影,然後列舉不在集合 \(i\) 中的電影 \(j\),二分找到 \(j\) 中的第一個開始時間小於 \(dp_i\) 的場次,轉移即可,時間複雜度 \(O(2^n n logc)\)。
P3119
先縮點,設 \(s\) 為 1 所在的強連通分量,跑從 \(s\) 出發和到 \(s\) 的最長路。
因為只能逆行一次,所以回到 1 肯定是從1 出發到一個點 \(u\),再從 \(u\) 逆行到一個能到 1 的點 \(v\),所以列舉這一條逆行的邊,答案即為 \(\max(f[u][0] + f[v][1] + e[u][v] - cnt[s])\)。