QOJ2559

区间维护类的小(?)DS 题。感觉我不怎么会。

题意目的明确,就是要动态维护每个区间能覆盖的范围。

看一看,感觉题目里的条件很神秘,不知道怎么用。不过可以根据特殊性质推出一个性质:存在包含关系一定先选内部。

一开始的思路是用区间互相影响计算,但这个非常复杂,且非常假。

在写暴力的时候突然意识到离散化以后只有 \(\mathcal O(n)\) 次有效修改,也就是说只需要维护修改一小段对所有位置的影响。于是可以用树套树 2log 解决。

但这实在太若只了,肯定不是这么搞,看起来也不是很能过。我们肯定要用上包含的性质。

接下来我不会了,尝试推着题解编一个 motivation:

树套树的问题在于想维护影响到的集合只能从值域出发,如果我们能从区间角度出发就比较舒服,但这要求区间排布具有成段,均摊之类的性质。

区间不包含的部分分可以带给我们启发:按 \(l\) 排序后 \(l,r\) 均递增,包含 \(x\) 的区间是成段的。这个非常舒服。

考虑转化到这种情况,此时我们之前的性质开始发挥作用:只关注内部不包含其它区间的区间。

还是先按 \(l\) 升序排序,处理出来最初的不包含的区间。我们称关注的区间集合为 “有效区间”,未关注过的为 “候选区间”。

此时两两不包含,于是可以 \(\mathcal O(\log n)\) 维护一次修改。当我们删掉这个区间后,会有一些新的候选区间加入我们维护的集合。假设维护的区间是 \(p\),找到 “有效区间” 中 \(p\) 的前驱 \(j\),后继 \(k\),那么候选区间 \(i\) 能加入的充要条件为 \([L_i, R_i)\in (L_j, R_k)\)。我们不断找到 \(L_i>L_j\) 的区间中 \(R_i\) 最小的尝试加入即可。

最后一步感觉是套路的,但我确实不会,前面可能还能想一点吧,也许。

这个题的代码实现还是有点聪明的。一开始注意到了简洁的维护方法但写的时候又开始发电。有点难顶。

posted @ 2024-04-15 17:30  ImALAS  阅读(7)  评论(0编辑  收藏  举报