NOI2026 Day2 题解
在场。总结单列了。
T1
套路地二分 \(mid\),记 \(b_i=[a_i\ge mid]\),\(O(nk\log^2 n)\) 的 dp 是显然的,那么交换值和下标即可做到 \(O(nk^2\log n)\),但可惜做不动了。
但是这样很浪费。观察一下 \(1\) 的数量,肯定至少要有 \(\lceil\frac{k}{2}\rceil\) 个 \(1\),但 \(1\) 的数量足够也不一定满足条件,因为 \(t\) 个 \(1\) 意味着有 \(t+1\) 段 \(0\)。我们希望有形如 10 的东西。
对于 \(k\) 为偶数的情况,删除一段即可,找最小间距的 \(1\),判断能不能构成类似 ...|10|01|... 的结构,即距离 \(\le 3\),或者有 \(1\) 在边界,或者 10 在边界。
对于 \(k\) 为奇数的情况,要删除两段。和上面类似,但是要注意 1001001 不能删除两段,而 100101 可以,其它都是两段相离的情况,容易处理。
不过段数太少了这样讨论会有点问题,在 \(k\le K=5\) 的时候拼上暴力 dp 即可。时间复杂度 \(O(nK^2\log n)\)。
T2
先研究 prufer 序列的还原方式:维护一个集合,每次将最小的取出来匹配,如果 prufer 序列上的数是最后一次出现就加进集合。
考虑判断是否有 \(fa_x=y\):找到 \(x\) 最后一次出现的位置,设其匹配了位置 \(p\),令 \(C(p,x)\) 表示经过位置 \([1,p]\) 还有多少个在 \([1,x]\) 中的数没有出现过,那么应当有形如(可能有点小问题) \(C(p-1,x-1)\le p-1\) 的式子,观察这个式子,当 \(p\) 增大,左边每次变化量 \(0\) 或者 \(1\),右边一定增加 \(1\),那么取到的一定是一个区间,树套树即可维护。但直接做是 \(O(n\log^3 n)\) 的,改成树状数组/线段树上二分即可。时间复杂度 \(O(n\log^2 n)\)。
T3
咕咕咕。

浙公网安备 33010602011771号