「WC2020」有根树(轻重链剖分)

题目

容易发现题目中那个包含 1 1 1的连通块是提示你的,并不是来限制你的。
那么答案一定是 S S S中选择最大的若干个 w w w,剩下的 w w w的最大值 ≤ ∣ S ∣ \leq |S| S
设剩下的 w w w为集合 X X X
考虑一个调整的过程:
如果 ∣ S ∣ < max ⁡ w ∈ X w |S| \lt \max_{w \in X} w S<maxwXw,则选出 max ⁡ w ∈ X w \max_{w \in X} w maxwXw X X X删去后加入 S S S
如果 ∣ S ∣ > max ⁡ w ∈ X w |S| \gt \max_{w\in X} w S>maxwXw并且 min ⁡ w ∈ S w ≤ max ⁡ w ∈ X w \min_{w \in S} w \leq \max_{w \in X} w minwSwmaxwXw,则选出 min ⁡ w ∈ S w \min_{w \in S} w minwSw S S S删去后加入 X X X
并且每次加点删点后只会有一次调整。(但是前提是你不是无脑的把所有点都加入 X X X,如果当前加入的点 w > max ⁡ w ∈ X w w \gt \max_{w \in X} w w>maxwXw的话还是要加入 S S S,否则就无法高效的维护 S S S X X X。)
注意这里我们一定要保证 max ⁡ w ∈ X ≤ min ⁡ w ∈ S \max_{w \in X} \leq \min_{w \in S} maxwXminwS
那么就有一个很简单的 O ( q log ⁡ 2 n ) O(q\log ^2n) O(qlog2n)做法:
线段树维护每个点的 w w w,和每个区间的 max ⁡ w ∈ X w , min ⁡ w ∈ S w \max_{w \in X} w , \min_{w \in S} w maxwXw,minwSw,然后每次调整即可。
注意到我们会有区间加一操作,如果在这次操作之后不满足 max ⁡ w ∈ X ≤ min ⁡ w ∈ S \max_{w \in X} \leq \min_{w \in S} maxwXminwS
那么可以发现一定是(最多只有一个点)加一后达到了 ∣ S ∣ + 1 |S| + 1 S+1,同时 S S S中还有值为 ∣ S ∣ |S| S的元素。
那么只有一个点会违背规则,我们找出这样的一对点,他们分别在 X , S X,S X,S,然后将他们分别在 X , S X,S X,S删除后分别加入 S , X S,X S,X即可。
区间减一请读者自行思考。
使用 z k w zkw zkw

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值