loj AntiLeaf's Round

链接: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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值