容易发现题目中那个包含 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∣<maxw∈Xw,则选出 max w ∈ X w \max_{w \in X} w maxw∈Xw从 X X X删去后加入 S S S。
如果 ∣ S ∣ > max w ∈ X w |S| \gt \max_{w\in X} w ∣S∣>maxw∈Xw并且 min w ∈ S w ≤ max w ∈ X w \min_{w \in S} w \leq \max_{w \in X} w minw∈Sw≤maxw∈Xw,则选出 min w ∈ S w \min_{w \in S} w minw∈Sw从 S S S删去后加入 X X X。
并且每次加点删点后只会有一次调整。(但是前提是你不是无脑的把所有点都加入 X X X,如果当前加入的点 w > max w ∈ X w w \gt \max_{w \in X} w w>maxw∈Xw的话还是要加入 S S S,否则就无法高效的维护 S S S和 X X X。)
注意这里我们一定要保证 max w ∈ X ≤ min w ∈ S \max_{w \in X} \leq \min_{w \in S} maxw∈X≤minw∈S。
那么就有一个很简单的 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 maxw∈Xw,minw∈Sw,然后每次调整即可。
注意到我们会有区间加一操作,如果在这次操作之后不满足 max w ∈ X ≤ min w ∈ S \max_{w \in X} \leq \min_{w \in S} maxw∈X≤minw∈S。
那么可以发现一定是(最多只有一个点)加一后达到了 ∣ 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
「WC2020」有根树(轻重链剖分)
最新推荐文章于 2021-05-25 16:36:17 发布