口糊线段树

此下默认正解复杂度为 \(O(nlogn)\) 或者 \(O(nlog^2n)\)

T1

维护一个数列。支持以下三种操作

  1. 添加一个数,若不存在则忽略
  2. 删除一个数,若不存在则忽略
  3. 求数列中任意两数之差绝对值的最小值

\(O(nlogn)\)

解法一

线段树口糊怎么能够用线段树呢?
使用两个set。
一个维护数列,便于快速找到前驱后继。
当插入一个数时,另一个set插入 (new-前驱) (后继-new) 删除(后继-前驱)
删除一个数就是反过来。

解法二

还是一个维护数列的set,便于快速找到前驱后继。
当然我们还是可以值域线段树代替上文的第二个set。但是这样会显得这个解法二很sb
考虑值域线段树,维护每个位置上前驱的值和后继的值,以及其代表区间的ans。
然后就是一个区间覆盖区间取min线段树该做的事了。记得有个 -i/+i 的系数。

T2

维护 \(n\) 个集合,初始每个数都属于一个集合。
每次给定两个位置,合并两个位置所属的集合,并求出两个集合间产生的逆序对个数。

\(O(nlog^2n)\)

解法

启发式合并。
故问题转化成单点加法,区间查询。
注意如果后面的集合大小小于前面的,区间查询要改成后缀查询

T3

维护一个树。
有两种操作。

  1. 两点之间连边,如果连成环了,则无视该次操作。

  2. image

解法

不会?先菇着。

posted @ 2022-04-05 21:25  Hencecho  阅读(31)  评论(0编辑  收藏  举报