我们先看看原题的做法,dsu 边带权对吧。
再看这道题。序列?平衡树!
仔细观察这几个操作,发现不是 Splay 和 FHQ Treap 的常规操作。
如果实现需要一些奇怪的处理。
算一算复杂度是对的。
M 操作,就直接按照维护序列的方式把 y 所在序列合并到 x 所在序列中。
D 操作,让我们想到分裂操作,但是它给出的是结点编号而非排名,所以可以写一个函数求一下某结点的排名。
Q 操作,配合求结点排名的操作就很容易了,然后注意区间不一定 l≤r。
这些操作因为没有直接给定根节点,Splay 的话就直接 Splay 一下,FHQ Treap 就得找根。
这又让我们联想到并查集,但是很不幸的是,由于第二个操作,不能路径压缩。
不过,由于平衡树本来的期望树高就是 logn 的,复杂度有保障。
然后不开 O2 也只要 500+ms,比较稳,
听说还有 Splay 跑不进一秒的……
代码:
1 |
|