杂题选写
其实是三代目了,我要打十个光荣落幕。
就不写题面了吧,稍微写的快一点。
P14636 [NOIP2025] 清仓甩卖
当时的你又在想什么呢。
在新赛季的前一天,终于完成了 NOIP2025,上个时代已经过去了,那个悲痛的时代。
重新做一遍,发现我当时离正解或许真的只差一步,场上做了 2h 的紧张可能已经让我难以进一步思考细节了,于是就匆匆开写。
如今回头看,如果我当时再冷静一点,如果我再细致一点,如果我少看几次时间,或许我就做出来这题了呢,或许一切都不一样了呢。
三个月的颓废可能真的是巨大打击,我真的一度想过放弃,那时真的不知道有什么能再支持我走下去了,烂的彻底的文化课,二等奖的竞赛,我究竟还有什么。
可能是省选 d1 的意外发挥,可能是和家长的争吵,可能是 cmd 那个视频,回想过去的点点滴滴,或许我还有机会,只是希望并不大罢了。
可能现在我也不知道到底是什么在支持我走下去,可能就只是单纯为了那点面子,可能就为了证明我还是个正常人类。
或许,一切还不迟?
考虑只有类似 1...2...1 的情况会出现问题,不妨记较大的选择 \(2\) 的是 \(a_y\),较小的选择 \(1\) 但比 \(\frac{a_y}{2}\) 大的是 \(a_x\),显然此时需要有 \(a_x < a_y < 2a_x\),再找到最小的 \(a_z + a_x = a_y\),然后我们以此分段。
- \(\le a_z\) 的部分,任意选择就好了,不管怎么样贪心都是错的。
- \(a_z < a_i \le \frac{a_y}{2}\) 的部分,不能选择 \(1\),否则贪心就是对的了。
- \(\frac{a_y}{2} < a_i \le a_x\) 的部分,不能选择 \(1\),否则贪心就是对的了。
- \(a_x < a_i \le a_y\) 的部分,选择 \(1\) 可以被选,选择 \(2\) 不会被选,所以会使用 \(0/1\) 块钱。
- \(a_y < a_i\) 的部分,因为不管选什么都比 \(a_y\) 值,所以可以任意选,用掉 \(1/2\) 块钱。
第三部分也可以看做为了防止数重的钦定,反正我是这么理解的。
考虑方案,第一部分方案是 \(2^z\),二三没有贡献,最后两部分可以直接考虑组合意义,先一块减去一块钱,再选是否减去,就只需要一个组合数了,避免了范德蒙德卷积。
复杂度 \(O(n)\)。
P14637 [NOIP2025] 树的价值
好玩,这真是好题。
先来一个比较套路的,看到 \(\operatorname{mex}\) 考虑延迟钦定,设 \(f_{i,j,k}\) 表示 \(i\) 子树内,\(\operatorname{mex} = j\),当前有 \(k\) 个未填的,每次子树 chkmx,然后直接加贡献就好了,树上背包复杂度 \(O(n^3)\),获得 48 分。
进一步地,注意到部分分给了和深度相关,考虑把复杂度变成和深度相关,这个状态肯定难以优化,考虑重新分析问题。
刚才我们是在动态决策每个点填的值,现在不妨反过来,我们对每个点决策其贡献范围,具体地,假设一个点是之前“未填的”点,那么在子树 chkmx 之前,他作为最大 \(\operatorname{mex}\) 的贡献一定会是一条链。
这是一个重大发现,我们可以把 \(\operatorname{mex}\) 拆成若干条链的并的结果,那么,我们考虑直接把这个贡献链扔到状态里,设 \(f_{i,j,k}\) 表示 \(i\) 子树,祖先的最长链长为 \(j\),当前延伸的链长为 \(k\),每次每个点只需要选择祖先的最长链贡献答案即可。现在我们的复杂度终于和深度相关了,复杂度 \(O(nm^2)\)。
进一步地,考虑简化这个状态,因为很多情况下感觉这个状态是冗余的,具体地,可以拆成两个状态:
- \(f_{i,j}\) 表示 \(i\) 子树,祖先最长链是 \(j\),而且当前点和父亲没有边的最大值。
- \(g_{i,j}\) 表示 \(i\) 子树,祖先最长链是 \(j\),而且当前延伸链就是最长链的情况。
为什么可以这样简化呢,注意到如果出现了祖先是最长链但是不是当前链而且当前点和父亲有边的情况,我们可以这条链直接接到祖先最长链上,这样显然是更优的。
考虑这两个状态的转移,初始值肯定是 \(g_{i,j} \gets j\times siz_i\),\(f_{i,j}\) 相同,对于 \(g\) 的转移,有:
这个转移是简单的,而对于 \(f\) 的转移,我们必须要钦定下一条长链是多少,而为了让下一条链产生作用,他的长度必须不小于 \(i\),但是,我们注意到 \(g\) 其实已经包含了延长链的方案,于是我们取 \(g_{y,i}\) 即可,记 \(y\) 为 \(x\) 的 \(i\) 级儿子:
考虑最后一个系数怎么处理,我们对于每个 \(f_{x,i}\) 计算其父亲除了他这个子树的 \(f_{z,i}\),每次只需要查一个子树和,支持单点加法,这个显然可以做到 \(O(\log n)\),于是现在复杂度 \(O(nm\log n)\),略微卡常已经可以通过了。
考虑进一步的优化,我们对每个 \(i\) 分开做,每次只需要保留 \(i\) 和 \(i+1\),空间变成 \(O(n)\),对于最后那个贡献,考虑其因为和深度强相关,每次继承长儿子的答案,暴力维护其他儿子的答案,长剖维护即可,复杂度 \(O(nm)\),可能说的有点问题。
P14638 [NOIP2025] 序列询问
部分分还是有强启发性的。
考虑 \(R=n\) 的情况,对于每个点 \(i\),如果区间左端点 \(l \le i-L+1\),那么右端点 \(r \ge i\) 随意选即可,那就是需要一个前缀 \(\min\) 后缀 \(\max\)。
对于 \(l > i-L+1\) 的情况,考虑按照 \(L\) 长度跑单调队列求最小值即可,复杂度 \(O(nq)\)。
进一步地,如果 \(R \neq n\),我们考虑怎么把问题转化成刚才的,对整个序列按照 \(R\) 分块,每块内可以按照刚才的办法,块间只需要钦定区间跨过 mid,然后对左右查一个区间 \(\min\) 区间 \(\max\) 即可,这就做完了?
复杂度 \(O(nq)\)。

浙公网安备 33010602011771号