二叉搜索树 & 平衡树
参考资料
__gnu_pbds::tree
#include <bits/extc++.h>
using namespace __gnu_pbds;
tree<pair<int,int>,null_type,less<pair<int,int>>,rb_tree_tag,tree_order_statistics_node_update> T;
笛卡尔树
int top=0;
s[++top]=0;
for(int i=1;i<=n;i++)
{
while(top&&a[s[top]]>a[i])son[i][0]=s[top--];
if(s[top])son[s[top]][1]=i;
s[++top]=i;
}
例题
你需要写一种数据结构,来维护一些数,并且提供以下操作:
- 插入一个数 。
- 删除一个数 (若有多个相同的数,应只删除一个)。
- 定义排名为比当前数小的数的个数 。查询 的排名。
- 查询数据结构中排名为 的数。
- 求 的前驱(前驱定义为小于 ,且最大的数)。
- 求 的后继(后继定义为大于 ,且最小的数)。
您需要动态地维护一个可重集合 ,并且提供以下操作:
- 向 中插入一个数 。
- 从 中删除一个数 (若有多个相同的数,应只删除一个)。
- 查询 中有多少个数比 小,并且将得到的答案加一。
- 查询如果将 从小到大排列后,排名位于第 位的数。
- 查询 中 的前驱(前驱定义为小于 ,且最大的数)。
- 查询 中 的后继(后继定义为大于 ,且最小的数)。
本题强制在线,保证所有操作合法(操作 保证存在至少一个 ,操作 保证存在答案)。