「JOI 2025 Final」只不过是长的领带 2 / Just Long Neckties 2

考虑钦定了一些观众去回应怎么算。让 \(i\)\(j\) 连边,当且仅当 \(i<j\) 并且 \(A_i<A_j\)。问题就成了被选中观众的点的最小链覆盖。因为显然是偏序集,所以考虑 Dilworth 定理转化成最长反链覆盖,即最长下降子序列。

也就是我们要选出一个支配集,使得其 LDS 长度最小。用经典 dp 来做,并且我们实际上只需要用 \(S\) 来标记状态(似乎不用转化成 LDS 也能根据贪心有一样的状态)。令 \(f_S\) 表示最晚能从哪里使状态变成 \(S\),容易发现这个点越靠后越好。我们可以枚举下一个状态与当前状态变化的位置 \(x\),那么选择的序列一定是先是一堆 \(S\) 中的数,然后是 \(x\)。并且 \(x\) 前面的 \(S\) 中的数都是能选尽量选。这样一来也就是说如果从 \(f_S+1\) 到一个位置 \(x\) 中间没有两个连续的且不在 \(S\) 中的数,那么就可以对 \(f_{S\bigcup \{x\}}\) 产生 \(x\) 的贡献。那么对于 \(S\) 找到 \(f_S\) 后面第一个连续两个数不在 \(S\) 中的位置,那么再找到这个位置前面的第一个 \(x\) 即可。特殊的,如果这样的位置不存在,就可以对答案产生贡献。

关于如何找到这样的位置:记 \(g_{i,j}\) 表示 \(i\) 之后第一个满足 \(A_x=A_i\) 并且 \(A_{x+1}=j\) 的位置。这样就可以方便转移了。

时间复杂度 \(\mathcal O(nV+2^VV^2)\),空间复杂度 \(\mathcal O(nV)\)

posted @ 2025-02-15 15:21  TulipeNoire  阅读(48)  评论(0)    收藏  举报