平衡树入门刷题笔记

普通平衡树

  • 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]书架

一道裸的文艺平衡树。

讲一下另一种解法。

采用倒序(如果正向插入的话,那么在位置后的每一个数都得后移一位,造成时间的浪费)。

然后发现,最后插入的数不会被覆盖掉,比如 (0space6) ,那么第一个是 (6) 不会变。

模拟几次后发现,找第 (i+1) 个空位即可。

权值分块。

Code

原文地址:https://www.cnblogs.com/cjl-world/p/12997181.html