平衡树入门刷题笔记
普通平衡树
- P3369 【模板】普通平衡树
- P6136 【模板】普通平衡树(数据加强版)
- P2286 [HNOI2004]宠物收养场
- P2234 [HNOI2002]营业额统计
- P3871 [TJOI2010]中位数
- P3224 [HNOI2012]永无乡
- P1486 [NOI2004]郁闷的出纳员
注:平衡树均为 \(fhqtreap\)
I
模板题
洛谷P3369,P6136,P3871
其中P3369,P6136就是板子。
P3871 中位数,\(print(s(root)>>1);\) 即可
II
P2234 [HNOI2002]营业额统计
P2286 [HNOI2004]宠物收养场
属于可以用 \(std::set\) 水掉的题。
找前驱的方法
set<int>::iterator it=S0.lower_bound(x);
if(it!=S0.begin()) {
it--; //<--------这就是前驱
...;
}
要是 \(set\) 里没数的话 \(S.begin()==S.end()\)
III
P1486 [NOI2004]郁闷的出纳员
由于加上和减去是每位员工的,
不改变的平衡树的结构,可以用平衡树\(+tag\) 来做。
当然,把本题转化为模板题来做也是可以的(通过维护一个 \(change\) ,使 \(x+change\) 为真实工资)。
IV
P3224 [HNOI2012]永无乡
平衡树合并,详见https://cjlworld.blog.luogu.org/wu-xuan-treap-fhqtreap
文艺平衡树
- P3391 【模板】文艺平衡树
- P2042 [NOI2005]维护数列
- P2710 数列
- P3850 [TJOI2007]书架
I
- P3391 【模板】文艺平衡树
- P2042 [NOI2005]维护数列
- P2710 数列
详见https://cjlworld.blog.luogu.org/wu-xuan-treap-fhqtreap
II
P3850 [TJOI2007]书架
一道裸的文艺平衡树。
讲一下另一种解法。
采用倒序(如果正向插入的话,那么在位置后的每一个数都得后移一位,造成时间的浪费)。
然后发现,最后插入的数不会被覆盖掉,比如 \(0\space6\) ,那么第一个是 \(6\) 不会变。
模拟几次后发现,找第 \(i+1\) 个空位即可。
权值分块。
Code
- https://github.com/cjlworld/OJ/blob/master/P3369.cpp
- https://github.com/cjlworld/OJ/blob/master/P6136.cpp
- https://github.com/cjlworld/OJ/blob/master/P2286.cpp
- https://github.com/cjlworld/OJ/blob/master/P2234.cpp
- https://github.com/cjlworld/OJ/blob/master/P3871.cpp
- https://github.com/cjlworld/OJ/blob/master/P3224.cpp
- https://github.com/cjlworld/OJ/blob/master/P1486.cpp
- https://github.com/cjlworld/OJ/blob/master/P1486x.cpp
- https://github.com/cjlworld/OJ/blob/master/P3391.cpp
- https://github.com/cjlworld/OJ/blob/master/P2042.cpp