【笔记】USACO22OPEN
T1
直接 DP,\(f_{i,j}\) 表示区间 \([i,j]\) 的答案,直接做是 \(\mathcal{O}(N^3)\),也可以二分或者直接双指针。
满分不会待补。
T2
首先如果存在一个点,它不能到达任何一个环,那么一定先手必胜。这一步可以一遍拓扑排序。
否则结束的状态一定是两个石子,一个石子堵住另一个石子(不能到达一个环的点要删掉),所以图中必然存在边 \(x\to y\),其中 \(x\) 的出度为 \(1\)。
那么我们可以把 \(x,y\) 缩成一个点,然后合并重边,一直重复这个操作直到所有点的出度 \(>2\)。
那么对于一个询问,直接判断输入的两个点是否是合并后的同一个点。
直接合并的复杂度可能有点假,我们记 \(F(x) = \{y\ |\ x\to y\in E\}\),那么合并点 \(x, y\),将 \(x\) 合并到 \(y\) 上和把 \(y\) 合并到 \(x\) 上的复杂度分别是 \(|F(x)|,|F(y)|\),所以启发式合并即可。
T3
\(f_{i}\) 表示以 \(i\) 结尾的最大的 \(k\),枚举 \(j>i\) 转移,条件是 \([a_j > a_i] = [s_{f_i + 1} = U]\),直接转移是 \(\mathcal{O}(N^2)\),显然可以线段树优化至 \(\mathcal{O}(N\log N)\)。