高能预警! 需要前置知识“摊还分析”和“splay”
log x + log y ≤ 2 l o g ( x + y ) − 2 \log x+\log y \le 2log (x+y)-2 logx+logy≤2log(x+y)−2 容易看出这其实与 4 x y ≤ ( x + y ) 2 4xy\le (x+y)^2 4xy≤(x+y)2等价,即与 ( x − y ) 2 ≥ 0 (x-y)^2\ge0 (x−y)2≥0等价。
对每个节点 x x x,设其大小为 c ( x ) c(x) c(x)(一个正数,此处取一即可),其子树的大小为 s ( x ) = ∑ u ∈ s u b t r e e ( x ) c ( u ) s(x)=\sum_{u\in subtree(x)}c(u) s(x)=∑u∈subtree(x)c(u),这个节点对势函数的贡献为 ϕ ( x ) = log s ( x ) \phi(x)=\log s(x) ϕ(x)=logs(x)。 定义整棵树的势函数 Φ ( T ) = ∑ x ∈ T ϕ ( x ) \Phi(T)=\sum_{x\in T} \phi(x) Φ(T)=∑x∈Tϕ(x)。显然 Φ ( T ) > 0 \Phi(T)>0 Φ(T)>0。
因为两种情况对称,所以图只画了 z i g zig zig情形
Y X' X C -> A Y' A B B CΔ Φ = ϕ ( X ′ ) + ϕ ( Y ′ ) − ϕ ( X ) − ϕ ( Y ) = ϕ ( Y ′ ) − ϕ ( X ) ≤ ϕ ( X ′ ) − ϕ ( X ) ≤ 3 ( ϕ ( X ′ ) − ϕ ( X ) ) \begin{aligned}\Delta\Phi&=\phi(X')+\phi(Y')-\phi(X)-\phi(Y)\\ &=\phi(Y')-\phi(X)\\&\le\phi(X')-\phi(X)\\&\le3(\phi(X')-\phi(X))\end{aligned} ΔΦ=ϕ(X′)+ϕ(Y′)−ϕ(X)−ϕ(Y)=ϕ(Y′)−ϕ(X)≤ϕ(X′)−ϕ(X)≤3(ϕ(X′)−ϕ(X))
图还是照例只画一种……
Z X' Y D A Y' X C -> B Z' A B C DΔ Φ = ϕ ( Y ′ ) + ϕ ( Z ′ ) − ϕ ( X ) − ϕ ( Y ) \Delta\Phi=\phi(Y')+\phi(Z')-\phi(X)-\phi(Y) ΔΦ=ϕ(Y′)+ϕ(Z′)−ϕ(X)−ϕ(Y) ∵ s ( X ) + s ( Z ′ ) = s ( X ′ ) − c ( X ′ ) < s ( X ′ ) ∴ ϕ ( Z ′ ) < 2 ϕ ( X ′ ) − 2 − ϕ ( X ) ∴ Δ Φ < ϕ ( X ′ ) + ( 2 ϕ ( X ′ ) − 2 − ϕ ( X ) ) − ϕ ( X ) − ϕ ( X ) = 3 ( ϕ ( X ′ ) − ϕ ( X ) ) − 2 \because s(X)+s(Z')=s(X')-c(X')<s(X')\\ \therefore \phi(Z')<2\phi(X')-2-\phi(X)\\ \therefore\Delta\Phi<\phi(X')+(2\phi(X')-2-\phi(X))-\phi(X)-\phi(X)=3(\phi(X')-\phi(X))-2 ∵s(X)+s(Z′)=s(X′)−c(X′)<s(X′)∴ϕ(Z′)<2ϕ(X′)−2−ϕ(X)∴ΔΦ<ϕ(X′)+(2ϕ(X′)−2−ϕ(X))−ϕ(X)−ϕ(X)=3(ϕ(X′)−ϕ(X))−2
画两张图?不存在的……
Z X' Y -> Y' Z' A X A B C D B C∵ s ( Y ′ ) + S ( Z ′ ) = s ( X ′ ) − c ( X ′ ) < s ( X ′ ) ∴ Δ Φ = ϕ ( Y ′ ) + ϕ ( Z ′ ) − ϕ ( X ) − ϕ ( Y ) < ( 2 ϕ ( X ′ ) − 2 ) − ϕ ( X ) − ϕ ( X ) < 3 ( ϕ ( X ′ ) − ϕ ( X ) ) − 2 \because s(Y')+S(Z')=s(X')-c(X')<s(X')\\ \begin{aligned}\therefore\Delta\Phi&=\phi(Y')+\phi(Z')-\phi(X)-\phi(Y)\\ &< (2\phi(X')-2)-\phi(X)-\phi(X)\\ &<3(\phi(X')-\phi(X))-2 \end{aligned} ∵s(Y′)+S(Z′)=s(X′)−c(X′)<s(X′)∴ΔΦ=ϕ(Y′)+ϕ(Z′)−ϕ(X)−ϕ(Y)<(2ϕ(X′)−2)−ϕ(X)−ϕ(X)<3(ϕ(X′)−ϕ(X))−2
对于操作 s p l a y ( x ) splay(x) splay(x),把它拆成若干上述旋转,显然 Δ Φ < 3 ϕ ( r o o t ) − d e p ( x ) \Delta\Phi<3\phi(root)-dep(x) ΔΦ<3ϕ(root)−dep(x)。而单次操作的实际代价可表示成 k i ∗ d e p ( x ) + c i k_i * dep(x)+c_i ki∗dep(x)+ci。
所以,使用套路,将势函数乘上 k = max { k i } k=\max\{k_i\} k=max{ki},这样单次操作的摊还代价为 Δ Φ + k i ∗ d e p ( x ) + c i < 3 k ϕ ( r o o t ) − k ∗ d e p ( x ) + k i ∗ d e p ( x ) + c i = O ( 3 k log s ( r o o t ) ) = O ( log s ( r o o t ) ) \Delta\Phi+k_i * dep(x)+c_i\\<3k\phi(root)-k*dep(x)+k_i * dep(x)+c_i\\=O(3k\log s(root))=O(\log s(root)) ΔΦ+ki∗dep(x)+ci<3kϕ(root)−k∗dep(x)+ki∗dep(x)+ci=O(3klogs(root))=O(logs(root))
令 c i = 1 c_i=1 ci=1,设总结点数为 n n n,得到最终摊还代价 O ( log n ) O(\log n) O(logn)。自带一个 2 ∼ 3 2\sim 3 2∼3的常数。
实测 L u o g u Luogu Luogu模板文艺平衡树有 % 50 \P %50的数据满足总旋转次数 ≤ 2.6 × n log n \le 2.6\times n\log n ≤2.6×nlogn 有 % 100 \0 %100的数据满足总旋转次数 ≤ 2.73 × n log n \le 2.73\times n\log n ≤2.73×nlogn