NOIP2025 整理
NOIP2025 整理
纪念死去的 NOIP2025。
先分析问题,先找性质,别先向上套做法或套路。
B. P14636 [NOIP2025] 清仓甩卖
考虑这样的贪心策略什么时候不优:装入了一个 \(1\),接下来考虑 \(2\) 时装不下了,只能再装一个 \(1\) 或者不装。但可能直接装这个 \(2\) 更优。
枚举这三个,分别为 \(i,j,k\)。整理一下条件,有 \(a_i>\frac {a_j} 2 >a_k,a_i+a_k<a_j\)。
不难发现,此时 一定有 \(a_j>a_i>a_k\)。所以我们先将所有物品按 \(a\) 降序排序。
确定 \(i,j,k\) 后来算方案数。\(i,k\) 之间不能有 \(1\),\(k\) 后面可以任意填 \(1,2\)。在 \(j\) 之前,所有的物品一定都装进来了,\(j,i\) 之间的 \(1\) 都装进来,\(2\) 都没装进来。
所以方案数为 \(2^{n-k}\times \binom{i-2}{m-(j-1)}\)。先预支前面 \(j-1\) 个 \(1\),剩下的若给 \(j\) 前面的就变为 \(2\),若给 \(j,i\) 之间的就变为 \(1\)。
固定 \(j,k\),对应的 \(i\) 是一段区间,双指针维护。预处理组合数前缀和做到 \(O(n^2)\)。
C. P14637 [NOIP2025] 树的价值
\(O(n^3)\) 做法
这个 \({\rm mex}\) 就很奇怪,没有什么好的贪心策略,那么考虑 dp。
\(x\) 子树里的不一定直接给 \(x\) 贡献,而是可能大于 \(x\) 的权值向上贡献。这一部分不好决策,所以 延后处理。
设 \(f_{x,i,j}\) 为考虑 \(x\) 子树,\(v_x=i\),有 \(j\) 个延后节点所能获得的最大价值。
转移 \(f_{x,\max(i,j),k+l} \leftarrow f_{x,i,k}+f_{y,j,l}\)。最后再 \(f_{x,i+k,j-k} \leftarrow f_{x,i,j}+i+k\)。
第一个用前缀 \(\max\) 优化 \(\max\) 卷积,第二个二维前缀 \(\max\) 优化。\(O(n^3)\)。
\(O(nm^2)\) 做法
上面的 dp 仍有一定的冗余:只有价值最大的子节点的价值有用。
而且这个 “价值最大” 的条件也可以放宽:每个非叶子节点选择一个子节点,将其价值接续过来。一个节点的价值为 接续节点的价值加上在这里使用的延后节点个数。
但仍需要记录接续节点的价值,并没有什么改善。
将接续关系刻画出来,形成了一个链剖分结构(和深度限制联系起来)。不好记录价值,就 改变答案计算方式,将贡献摊到每个延后节点上。
从一个延后节点开始向根走,会经过若干条不完整的接续链。在这些不完整链中,这个节点一定会选择最长的那条,从底部贡献给整条链。
所以每个节点的贡献改写为:从 \(x\) 到根最长接续链的长度。
只需记录当前链长度,最长链长度即可做到 \(O(nm^2)\)。
\(O(nm\log n)\) 做法
同时记录当前、最长仍有些冗余。
观察 1: 若 \(x\) 是某条接续链的顶端,且 \(fa_x\) 向上的这条链比 \(x\) 的链长,那么 \(x\) 这条链就没用了。
所以我们忽略这样所有的链,将它们看作若干条长度为 \(1\) 的链,不会影响答案。
观察 2: 若 \(x\) 为某条链的顶端,\(x\) 子树只有两种情况:
-
\(x\) 子树内所有的接续链都比 \(fa_x\) 向上的链短。
-
\(x\) 链的长度比 \(fa_x\) 向上的链长。
否则,\(x\) 链没有 \(fa_x\) 的长,且 \(x\) 子树内有比 \(fa_x\) 长的,那么忽略所有比 \(fa_x\) 短的链,将某条比 \(fa_x\) 长的延伸至 \(x\),一定更优。
所以到 \(x\) 这个节点,要么将 \(fa_x\) 的链接续过来,要么直接向下开一条长度与其相等的链。这样就不用记录当前链长度了。
设 \(f_{x,j}\) 为 \(x\) 为某个链的顶端,上面的最大链长为 \(j\) 的最大价值,\(g_{x,j}\) 为 \(x\) 所在链为最长链,长度为 \(j\) 的最大价值。
\(\sum siz_x\) 为 \(O(nm)\) 的,因为每个节点最多贡献 \(m\) 次。 所以第三个转移枚举 \(x\) 所有后代是可行的。
后面 \(f_{v,j}\) 的那项可以对每个 \(j\) 开一棵树状数组,子树加、单点查。
总时间复杂度 \(O(nm\log n)\),空间复杂度 \(O(nm)\)。
D. P14638 [NOIP2025] 序列询问
区间询问,在二维平面上考虑。
对于询问 \((L,R,i)\),把涉及的区间拿出来,在平面上框出了一个梯形。这个梯形是由 \(x=i,y=i,y=x+L-1,y=x+R-1\) 四条直线框出来的。
可以发现,对于相同的 \((L,R)\),\(y=x+L-1,y=x+R-1\) 这两条直线不会变。所以 \(i\) 变化时,梯形在这两条直线中间平移。
当 \(2L\ge R\) 时,两个平行四边形就可以覆盖梯形。
当 \(2L<R\) 时,先用一个平四覆盖右上方,左下方的等腰直角三角形用两个平四、一个正方形覆盖。
平四最值用 ST 表+单调队列 求解,正方形最值直接使用 ST 表。
复杂度 \(O(nq)\)。

浙公网安备 33010602011771号