2025.4.9 ZKY 题单
4.9 ZKY 精选题单
B - 森林游戏
从简单开始考虑
定义一个局面的权值为 先手 - 后手 的最大值。
全是孤点,显然从大到小排序。
长为 2 的有向链 \(u\to v\),若 \(a_u>a_v\),仍然可以直接排序;否则一定放到最后取。因为先手取 \(u\),后手一定取 \(v\),这是不优的。此时可以直接删去 \(u\to v\)。
长为 3 的有向链 \(u\to v\to w\),若 \(a_u\) 最大,直接删去 \(u\),剩下长为 2 的链;若 \(a_w\) 最大,\(v\to w\) 一定最后取,也可以直接删去。若 \(a_v\) 最大,那么先手取 \(u\) 的唯一目的是为了取 \(w\),则在后手取 \(v\) 后一定立即取 \(w\)。于是将 \(u\to v\to w\) 合并成一个 \(a_u+a_w-a_v\) 的点。
通过上面两种操作,已经可以将一条链变为从上到下不增的。
我们显然希望将树转化成链。
考虑归纳,若点 \(u\) 儿子的子树都已经变成一条链,能否合并这些有向链。感受一下,直接对子树链进行归并,将 \(u\) 放在链头,然后对链头进行合并,使有向链不增,这样的归并对整体局面是没有影响的。
于是平衡树之类维护有向链,随便归并一下就做完了。
C - Brackets
noip 模拟赛做过。
两种思路:
- 转 \(\plusmn 1\) 序列,开始全为右,贪心从左向右考虑能否放左括号,维护后缀和 max \(\le 0\)。
- 所有左括号位置被 \(1,3,5,\dots,2n-1\) 偏序,贪心找 lowerbound 匹配。
E - Recover the tree
按区间长度从小到大考虑。
记当前考虑区间 \([x,y]\),如果已经联通,什么都不做。
否则,\([L_x,R_y]\) 之间可能有 \(k+2\) 个连续段,形如 \([l_0,r_0],[l_1,r_1],[l_2,r_2],\dots,[l_{k+1},r_{k+1}]\),可以这样连边 \(\dots - l_4 - l_2 - x - y - l_1 - l_3 - \dots\) 保证没有比 \([x,y]\) 短的区间联通。
F - 雷同
将合并过程画成树,在树上考察两种代价。
显然的,重量值的贡献就是 \(\sum w_id_i\),直接按重量值从小到大分配从深到浅的叶子即可。
磨损值的贡献与重量值无关,只与树的形态有关。每次合并的贡献是较小的磨损值,较大的磨损值继续变大。那么磨损值的总贡献就是 \(\sum\limits_{path \in S} 2^{len(path)} -1\),其中 \(S\) 指除根所在长链的长链集合。由于 \(|S|=n-1\),下面计算时可以去掉 \(-1\)。
重新刻画构建合并树的过程。认为每个点有 “最终深度” \(d_i\) 和 “高度” \(h_i\)。每次合并两个 \(d_i\) 相等的点,将较小的 \(h_i\) 截断,较大的 \(h_i\) 上传。那么我们肯定希望在全局尽量截断更大的 \(h_i\),显然应该截断第 $2,4,6,8,\dots $ 大。
化简计算磨损值的过程。若当前层已经有 \(b\) 个节点,再加入一个叶子,长链长度为 \(ctz(b)\),磨损值贡献为 \(lowbit(b)\)。(考虑从 \(0\) 开始对当前层节点编号)
根据上面的结论,设计 dp 解决原问题。
\(f(i,j)\) 表示当前已经确定了 \(i\) 个叶子,当前层还有 \(j\) 个节点没确定是不是叶子。
- \(f(i,j) + sw_i\to f(i,2j)\),当前层全部不是叶子,进入下一层。
- \(f(i,j) + lowbit(j)\to f(i+1,j-1)\),新钦定一个叶子。
复杂度 \(O(n^2)\)
J - Replace
noip 模拟赛做过。
考虑能否进行区间合并 $\to $ ST 表状物。
通过区间有交证明区间并的 \(f\) 等于 \(f\) 的区间并。
K - 大冬天题
神奇构造。
考虑两个奇数 \(x,y\),\(gcd(x,y)=gcd(x-y,y)\)。若 \(x-y=2^j\) 则 \(x,y\) 一定互质。
基于此进行构造。称 \(<n\) 的数为“小数”,\(>n\) 的为“大数”。对于最小的小数 \(a\),找到最小的“大数” \(b\) 使 \(b-a=2^j\),容易说明一定能找到这样的数。将 \((a,b),(a+2,b+2),\dots\) 两两配对一定互质,剩下的数还是一个连续区间,于是转化成子问题,递归解决即可。
复杂度 \(O(k)\)。
L - Problem of offices
遍历顺序一定是 \(a\to c\to b\to d\) 或者 \(a\to d\to b\to c\)。
欧拉序的特点是子树一定整体插入。对于非 \(a,b,c,d\) 所在的根的儿子子树,一定是整个插入欧拉序的;\(a,b,c,d\) 所在链挂的其他子树,也可以选择在 \(a\) 前或 \(a\) 后被遍历。
bitset 优化可行性背包,考虑 \(a\to b\) 必须插入 \(c\) 子树,查询 \(f(n/2-siz_c)\) 即可。
M - 棋盘
自然的,考虑用 2 进制进行构造,发现这样 \(Y\) 用的太多。
如果用增加进制的方式减少 \(Y\),又会导致 \(X\) 增加的特别快。
神奇的,考虑使用斐波那契进制。因为斐波那契进制没有相邻 1(否则可以用更高位表示),所以 \(Y\) 的消耗较少,而 \(X\) 的消耗也不多。
N - 小火车
考虑如果存在两种 01 赋值方案 \(S,T\) 满足 \(val(S)\equiv val(T) \pmod p\),那么对位减得到的方案满足 \(\equiv 0 \pmod p\)。又因为 \(p<2^n\),一定有解。
\(n\le 40\) 直接折半,接下来考虑合并。
由于我们只需要找到一组可行解,考虑将方案映射到 \([0,p-1]\) 上,则砍半后必有一边满足方案数 $\ge $ 区间长度,那么这边一定存在答案。
二分 + 双指针 check 即可找到答案 \(val \bmod p\) 的值,然后再双指针找两个方案即可。
O - vabank
神奇的 dp 优化交互,高楼扔鸡蛋升级版
初始一定只能询问 \(1,2,4,\dots\) 确定答案区间 \([2^k,2^{k+1})\),这需要花费大约 \(47\) 次询问。
后续询问,如果我们使用二分,这其实是不好的,因为如果问 \(mid\) 失败了,每次都需要问左端点得到钱。于是最多能卡到接近 \(3\log V\),这是无法接受的。
但是我们发现,其实如果问 \(mid\) 成功,进入右区间后,我们的钱数变多了,相当于省下了积累钱数的询问,理论上可以确定更大的区间。于是分割点 \(mid\) 应该是更接近左端点的。
设 \(f(i,j)\) 表示有 \(i\) 次询问机会,当前有大概 \(j\) 个左端点的钱,能确定多长的区间。这样 \(f(i,j)=f(i-1,j-1)+1+f(i-1,j+1)\),即取 \(mid=l+f(i-1,j-1)\),check mid 不成功就会少钱,否则就会多钱。注意到少的钱数其实大于 \(l\),可能需要调整,但感受上调整次数不会太多。
事实证明这个做法可以在 100 次内通过。

浙公网安备 33010602011771号