我根本不会平衡树
使用无旋 treap 维护权值,需要显示或隐示的保证权值互不相同。对于权值互不相同的 treap,可以看成是随机生成长度为
- 例如 P10284 [USACO24OPEN] Splitting Haybales P,这个题就很骚,不加第二关键字扰动 T 飞了。
平衡树合并
参考资料 "Merging treaps" -- or how to merge sorted sets in good complexity...
int merge(int x,int y) {
if (!x || !y) {
return x + y;
}
if (a[x].dat < a[y].dat) {
std::swap(x,y);
}
pushdown(x);
int A,B;
split(y,a[x].val,A,B);
a[x].ls = merge(a[x].ls,A);
a[x].rs = merge(a[x].rs,B);
return x;
}
设势能
对于合并
有一个结论是:
即
因为任意时刻