比如这题
设势函数=每个点所管区间内互异值的个数总和
一开始势能最大nlogn
操作1使得势能最多增加logn
操作2我们这样处理:每个点记录一下最大值和次大值,若x大于最大值退掉,若x在最大值与次大值之间则打一个tag,若x小于次大值则递归下去。
可以发现,每次递归下去时势函数都至少减1,这时我们要花费向下走左右子树,共2的时间。
那么,总的时间复杂度就控制在了势函数最大值(n+m) log n上。
但是题解的分析是n log^2 n的,不知道这个奇妙的分析方法有没有问题。
2019 UPD
这种线段树叫吉司机线段树。
复杂度的确是
O
(
(
n
+
m
)
l
o
g
n
)
O((n + m) log n)
O((n+m)logn)的
假如有区间加操作,那么复杂度可以证明为
O
(
n
l
o
g
2
n
)
O(n log^2 n)
O(nlog2n)。
但是实践上效率更接近于
O
(
n
l
o
g
n
)
O(n log n)
O(nlogn),并没有能卡成log^2的数据(没准他本来就是一个log呢?)