口糊线段树
此下默认正解复杂度为 \(O(nlogn)\) 或者 \(O(nlog^2n)\) 。
T1
维护一个数列。支持以下三种操作
- 添加一个数,若不存在则忽略
- 删除一个数,若不存在则忽略
- 求数列中任意两数之差绝对值的最小值
\(O(nlogn)\)
解法一
线段树口糊怎么能够用线段树呢?
使用两个set。
一个维护数列,便于快速找到前驱后继。
当插入一个数时,另一个set插入 (new-前驱) (后继-new) 删除(后继-前驱)
删除一个数就是反过来。
解法二
还是一个维护数列的set,便于快速找到前驱后继。
当然我们还是可以值域线段树代替上文的第二个set。但是这样会显得这个解法二很sb
考虑值域线段树,维护每个位置上前驱的值和后继的值,以及其代表区间的ans。
然后就是一个区间覆盖区间取min线段树该做的事了。记得有个 -i/+i 的系数。
T2
维护 \(n\) 个集合,初始每个数都属于一个集合。
每次给定两个位置,合并两个位置所属的集合,并求出两个集合间产生的逆序对个数。
\(O(nlog^2n)\)
解法
启发式合并。
故问题转化成单点加法,区间查询。
注意如果后面的集合大小小于前面的,区间查询要改成后缀查询
T3
维护一个树。
有两种操作。
- 两点之间连边,如果连成环了,则无视该次操作。
- 求
解法
不会?先菇着。