GJOI noip_csp训练赛5
posted on 2025-09-15 14:03:44 | under | source
B. P12576 [UOI 2021] 数字图
先二分答案 \(mid\),将 \(< mid\) 记为 \(0\)、否则 \(1\)。若当前先手是 \(A\),假如当前位置是 \(1\) 就直接结束,否则必须移动一步到相邻的 \(1\) 上,动不了也是输。
因此特判掉初始为 \(1\) 的,那么只保留两端分别是 \(0,1\) 的边,可以将博弈改写为:轮流移动动不了就输。但是本题还有一个步数限制,因为 \(2\mid 10^{100}\) 所以一直动的话先手还是输。
考虑处理转移成环的 dp。对于出度为 \(0\) 的点确定为必输态,同时连向它的点也确定为必胜态,于是每一轮类似拓扑排序去掉确定胜负的点即可。
若最终还有点,那么它们连向外界的必然是必胜态,于是只能在内部兜圈,根据先前讨论,此时 \(A\) 必败。
C. P11986 [JOIST 2025] 救护车 / Ambulance
考虑弱化原问题求两个点的情况,发现对角两个点有较好的性质,因为点到对角的距离之和固定。于是有简单贪心,按照到其中一个的距离排序,那么必然是一个前缀扔给这个点、后缀给另一个点。
那么分别按照两个对角排序得到两个序列。枚举前后缀分界线,那么所有点按照在两边序列里为前缀还是后缀,可分为 \(4\) 组。考虑枚举其中一组分配给一边的大小,那么肯定希望剩下给另一边的尽量小。于是对每一组做背包,便能枚举一组分配给一边的大小、进而推出其它组的选择并判定合法性。
前后缀 dp 一下就能做到 \(O(n^2T)\)。
总结:适当弱化问题可启发正解;最后判定合法性的处理很妙。
D. P11303 [NOISG 2021 Finals] Pond
容易有二维 dp 但没有前途,考虑去掉状态中的一维。那么需要换个方式计算贡献,考虑 \(i>k\) 的贡献,先默认直接行走是 \(x_i-x_k\) 的,假如行走时从 \(p>k\) 拐向 \(j<k\) 再回来,那么恰会额外产生 \(2(x_p-x_j)\) 的代价。而 \(i<k\) 同理。
于是考虑对拐点做 dp,记为 \(f_i\)。按照上述讨论,有转移:
- \(i>k\):\(f_i=\min\limits_{j\le k} (f_j+2(j-1)(x_i-x_j))\)。
- \(i<k\):\(f_i=\min\limits_{j\ge k} (f_j+2(n-j)(x_j-x_i))\)。
考虑 dijsktra 每次取出最小的 \(f\),注意到边权函数 \(w(i,j)\) 必然满足固定 \(i\) 时 \(j\) 越大值越大,固定 \(j\) 同理,因此不难归纳证明任意时刻取出的点构成一段区间 \([l,r]\),每次拓展 \(l-1\) 或 \(r+1\)。这也说明了跑出的最短路不会出现非法形态。
转移的式子容易写成一次函数的形式,从而李超树优化,\(O(n\log n)\),应该也能线性。
总结:二维状态(如区间 dp)通过重新计算贡献转一维状态(最短路),并由 dijsktra 分析最短路形态确保不会出现非法形态。

浙公网安备 33010602011771号