链接:https://loj.ac/contest/21
做了好久啊这套题。。
T1是不会的算法。。学了很久
T2的lazy调了很久
T3LCT很久没写过。。 复习了一下,然后还是lazy的push_down问题调了很久
总的来说做得还是很不顺利
但是还是很有收获的
附上题解(虽然官方都有)
T1:https://blog.csdn.net/qq_36797743/article/details/85223701
因为另开了一篇就不在这里写了
T2:
感觉是最简单的一个题了。。
容易想到,因为每一次是成段修改成一样的
因此,暴力做的话序列不同的颜色段就很少了
总的话是n+m段
我们每一次修改,可以暴力遍历所有颜色段,注意是一段一段遍历,然后每一段可以log修改
我的做法是每个颜色种了一棵线段树,维护区间个数
然后询问可以在线段树上直接二分
对于所属区间和数字,我也种了一棵线段树。。
总的复杂度是
O
(
n
l
o
g
n
)
O(nlogn)
O(nlogn)的
因为lazy下放了以后忘记清0而调了很久
T3:
显然是一个LCT
考虑如何维护答案
假设,我们每一次对询问节点
m
a
k
e
r
o
o
t
make_root
makeroot的话,我们只需要可以维护到根节点的答案就可以了
边权显然要拆为点权
考虑到LCT中,每一条链对应一条链,并且左儿子是浅的
那么计算贡献的时候有三部分组成
1.左右儿子的答案
2.除了左儿子以外所有黑点经过左儿子所有路径的答案
要注意的是,黑点要的是整个子树的
但是左儿子只需要是在splay上的路径和
自己想想为什么
为了资瓷swap,因此,还要维护一个镜像的东西,也就是左右反过来
然后就没什么了
如果没看懂的还可以看看这篇
比我详细多了。。
调了很久的地方是,如果你的lazy是自己还没有下放的话
那么在你update的时候,需要把左右儿子Push_down一次,否则会GG