(PKU+NOI)WC 2025 题解
引用框里写的是赛时想法。
PKUWC 2025
d1t1
通过百万富翁一题的结论不难想到,一定是询问若干个团。询问一个大小为
a 的团可以找到至少a-1 个坏电池。之后n^3 DP 或者直接推出式子均可通过。(赛时写的n^3 )
场切。
d1t2
赛时会了没调完的题。
考虑
l=1 怎么做。扫描线,注意到对于深度不同的两个点
p,q ,他们的x 级祖先必然不同。因此我们对于每个深度d 维护一棵虚树,查询就是查询每棵虚树对应深度点数之和。使用 bit 维护即可。这样是 1log 的,同时也给出了一个根号 log 的莫队做法。但是后者常数非常大,跑不动 sub3。
题外话:听说 这个莫队做法回滚后可以做到单根号,有人场上用这个过了。
继续分析性质,如果
l 不一定为1 ,那么我们相当于要去除虚树上“过期”的点。容易想到我们对于每个点,维护其最后一次被覆盖到的时间t_i ,修改相当于链赋值,查询相当于查询每棵虚树对应深度t_i \ge l 的点的数量。修改可以在每条重链上维护颜色段均摊,查询则是带修二维数点的形式。赛时写的bit套 pbds 的红黑树,常数很大而且写挂了。
由于赛时的树剖疑似挂了笔者并不清楚树套树能否通过本题(有人声称过了但是不清楚他是怎么写的)。一个更快的写法是,将带修二维数点转成三维数点然后跑 CDQ。这样复杂度是
record
d1t3
deepseek-r1 改编的现代诗
好题要点赞!
本题有一个非常简洁的线性做法。
一个想法是既然题目要求我们求出每个点最早的获胜时间,而这个东西信息量已经有
接着考虑 sub4。首先缩点,记 E' 为缩点后形成 DAG 的边集。(一个小细节是 tarjan 求出来的就是反拓扑序,直接用就好了,不需要重新拓扑排序。)修改状态定义,令
特判连通块内只有一个点的情况,此时与 sub3 转移相同。
否则:
- 一个 SCC 有多个起始时间可选;
- 一个点可以走回自己,故有
f_i = g_i 。
依然考虑求出
将 SCC 内所有点的对应时刻写在数轴上,找出第一段连续段
上述代码稍微修改一下即可获得 75 分,究其原因,在每个点的颜色有多个出现时刻的时候,暴力找连续段的复杂度不被
考虑使用数据结构维护。求 push_front 和从头开始按顺序遍历,使用链表维护即可。一个小细节是看上去要持久化,但是注意到找连续段的过程与维护
record
d2t1
有趣(?)的交互题。
考虑维护直径的三个端点
x,y,z 。初始设置为1,2,3 。第一轮将x 替换为query(p,y,z)最大的p 。第二轮替换y ,第三轮替换z 。这样使用了3n - \epsilon 次询问,找到了三个点(其中至少包含一条直径)和dis(x,y) 。再用
n 次询问可以知道dis(x,z) ,即可知道直径。可以获得
83 分,使用一些随机化技巧可以再高一些。
还能再给力一点吗?
找到
首先特判掉
在找到 query(x,y,i) 的值,记作 in 询问即可知道
- 如果在:
那么 in 询问即可知道是哪种情况,这样我们三条链长都知道了。
- 如果不在:
这意味着 in 询问即可。
record
d2t2
下称单次消耗代价为
1 的为 A 操作,代价为c 的为 B 操作。考虑贪心。不难发现如果我们使用 B 操作时完整地取走了
k 个球,那么一定不劣。进一步,我们发现:一定存在一组最优解,满足 B 操作形成了若干个连续段,并且只有不在连续段上或者是连续段末尾的位置可能使用操作 A。
通过这个不难设计一个平方 DP。记
f_i 表示将[1,i] 的盒子内的球全部取完所需代价,两种操作的转移代价都是好算的,拼上c=1 即可获得 73 分。
进一步考虑什么样的点可能成为连续段末尾。假设
假如我们可以对于每个
如何快速求
record
d2t3
你觉得这是题吗。
注意到可以贡献到
整除分块找到所有可能产生贡献的区间并去重,发现数的数量可以接受,分解出质因数跑 B 次狄利克雷前缀和,发现过了。
分解质因数的时候要对于不超过
复杂度不会证,应该也卡不掉。
record
NOIWC
t1
场切。
t2
record
t3
record