P9999 [Ynoi2000] tmostnrd 题解
nrd。
去年五月的模拟赛题,标算给了个带根号的东西,1kri 分享了一个 pog 做法。
思路
一个很自然的想法是扫描线,每个询问看成一个点,扫到
拿个并查集时刻把重合的点缩起来。
走一步的时候,这个点到根的路径上的点全部往下走,其他点全部往上走。
跨链的时候暴力做。向下跨链,每次操作最多出现
实现
1kri 当时好像讲了实现但是我忘了,搓了半年才搓出来(?
考虑到重链有
我们的 ds 还需要支持快速找到哪些点要跨链了。
枚举了很久做法之后发现大概只能树套树,对每个重链开一个小树,对所有重链开一个大线段树维护深度的最小值,减到
一、把询问
二、
三、所有点向上跳一步。
四、
五、处理向上跨链。
六、记录
先向上后向下会有点连跳两步,见样例第三组询问。
code
大战 nrd。
有个注意的地方是线段树的叶子的懒惰标记要推到平衡树的根上。
代码太长了放在这里。