CSP-S/NOIP 2025 补题
别问我为什么现在才补。
CSP-S
T1
简单贪心,场切了。
T2
实际上 \(\mathcal O(2^km\log k)\) 加个剪枝就冲过去了。
先对原来 \(m\) 条边跑最小生成树,再 \(2^k\) 枚举哪些后来的点要选,然后把边加进来继续跑最小生成树。直接拿堆维护。复杂度 \(\mathcal O(2^kkn\log k+m\log n)\)。
T3
AC自动机板子,场切了。
T4
考完听 4927618350 讲其实没听懂。现在一想觉得很自然。
设状态 \(dp_{i,j,k}\) 表示前 \(i\) 次面试中有 \(j\) 个人没过,其中有 \(k\) 个人满足 \(c_i>j\)。三种情况分讨:
- \(s_{i+1}=1\) 且 \(c_{i+1}>j\),那么面试成功,\(dp_{i+1,j,k+1}=dp_{i,j,k}\)
- \(s_{i+1}=0\) 且 \(c_{i+1}>j\),面试失败,枚举之前和现在共有 \(x\) 个人 \(c_i=j+1\),\(dp_{i+1,j+1,k+1-x}=dp_{i,j,k}\times C_{sum_{j+1}-sum_{j}}^{x}\times (k+1)^{\underline x}\)
- \(c_{i+1}\le j\),那么面试失败,同样枚举之前有 \(x\) 个人 \(c_i=j+1\),\(dp_{i+1,j+1,k-x}=dp_{i,j,k}\times C_{sum_{j+1}-sum_{j}}^{x}\times k^{\underline x}\times (sum_{j}-(i-k))\)
然后对于每个 \(j\),\(cnt_j\) 的和是 \(\mathcal O(n)\) 的。于是就可以做到 \(\mathcal O(n^3)\)。
NOIP
T1
简单贪心,场切了。
T2
简单计数,ARIS2_0 说很难,但我做下来只觉得是麻烦一点的题,场切了。
T3
场上为什么连 48pts 都不会写?
没见过的 Trick。首先容易想到每个点选择一个儿子继承,再把子树内的自由点拿来贡献。发现这是一个链剖分的形式,每个点的最大贡献为到根路径上最长的继承链长度。
然后就有朴素 \(\mathcal O(nm^2)\) dp。设 \(dp_{i,j,k}\) 表示 \(i\) 节点到根路径最长链长度为 \(j\),当前链长度为 \(k\) 的子树内贡献和。转移 \(dp_{i,j,k}=\max\limits_{x\in son_p}\{j+dp_{x,i+(i=j),j+1}+\sum\limits_{y\in son_p,y\not =x}dp_{y,i,1}\}\)。
调整法可以发现,只有 \(dp_{i,j,1}\) 和 \(dp_{i,j,j}\) 是有用的,于是把这两种状态分为 \(f_{i,j},g_{i,j}\) 重写转移。\(g_{i,j}\) 的转移还是原来的形式。对于 \(f_{i,j}\),枚举子树内和 \(i\) 距离为 \(j-1\) 的节点 \(x\),构成一条长为 \(j\) 的链,然后有 \(f_{i,j}=\max\{j(j-1)+g_{x,j}+\sum\limits_{y\in path(i,x),y\not=i}w_{y,j}\}\)。其中 \(w_{i,j}=\sum\limits_{x\in son_{fa_i},x\not=i}f_{x,j}\)。写个树状数组维护,复杂度 \(\mathcal O(nm\log n)\)。
\(\mathcal O(nm)\) 有点复杂,先不补了。
T4
补题的时候被我秒了。场上为什么只有 15pts?
直接考虑把子段和拆成两个前缀和相减的形式,那么对于每一个右端点,合法的左端点就在一个区间内取到。我们要最大化子段和,于是让右端点从右往左扫,对左端点维护一个单调队列。然而,我们发现只有单调队列队尾的贡献是能被统计到的。考虑队内元素的贡献,发现一个元素可能在单调队列中的区间是固定的,即 \([i,nxt_i)\),\(nxt_i\) 表示 \(i\) 后面比 \(i\) 小的第一个位置,直接单调栈求出。然后我们发现每个数的支配区间包含或不交,所以包含关系可以形成一个森林,直接维护即可。进一步,对于每个 \(i\),只要求出它在单调队列中的时候的 \(\max sum_r\) 即可,此时 \(r\in[nxt_i+L,i+R]\),直接ST表维护即可。复杂度 \(\mathcal O(n\log n+nq)\)。

浙公网安备 33010602011771号