【题解】P13131 [Ynoi Easy Round 2019] 神木辉 & P9999 [Ynoi2000] tmostnrq2
【题解】P9999 [Ynoi2000] tmostnrq2:
插入标记回收,考虑只有 \(a_i\) 到根的链是往下走的,\(a_i\) 不动。所以可以重链剖分,用平衡树维护每个重链上的查询点。
对于 \(a_i\) 的祖先链就是拉出平衡树的一个 \(dep\) 前缀打 +1 标记。对于其他大部分点,打全局 \(-1\) 标记。然后需要维护跨链的点,用一个 set 维护每个重链上 dep 最小的点就好了。
暴力维护复杂度就是正确的,考虑每个点初始势能是 \(\log n\) 条重链要跨,而 \(a_i\) 让祖先链都下来一个节点,会增加 \(\log n\) 的势能。所以整个复杂度就是 \(O(n\log ^2 n)\)。
【题解】P13131 [Ynoi Easy Round 2019] 神木辉:
在线做这个东西。
分块,需要维护每个点经过整块后到了哪里。
先建虚树,有 \(O(B)\) 个链和剩下虚树外的需要维护。
虚树外的需要找到其第一次走到虚树上是在什么时刻,可以 dfs 求出来。
然后和上面一样,维护 \(O(B)\) 个虚树边上的操作,可以用 deque 维护。
势能分析还是一样的,一个块内的势能总和是 \(B^2+n\)。
但是直接暴力遍历每个边进行修改就好了。
总复杂度 \(O(n\sqrt n)\)。
浙公网安备 33010602011771号