luogu P3835 【模板】可持久化平衡树
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
using namespace std;
const int maxn=500009;
const int oo=2147483647; int T;
int nn=0;
int ch[maxn*50][2]={0},siz[maxn*50]={0},pri[maxn*50]={0},ky[maxn*50]={0};
int root[maxn]={0}; void pushup(int x){
siz[x]=siz[ch[x][0]]+siz[ch[x][1]]+1;
}
int NewNode(int val){
int x=++nn;
ky[x]=val;
siz[x]=1;
pri[x]=rand();
return x;
}
int CopyNode(int y){
int x=++nn;
ch[x][0]=ch[y][0];
ch[x][1]=ch[y][1];
pri[x]=pri[y];
siz[x]=siz[y];
ky[x]=ky[y];
return x;
} int Mer(int x,int y){
if((!x)||(!y))return x+y;
if(pri[x]<pri[y]){
int p=CopyNode(x);
ch[p][1]=Mer(ch[p][1],y);
pushup(p);
return p;
}else{
int p=CopyNode(y);
ch[p][0]=Mer(x,ch[p][0]);
pushup(p);
return p;
}
} void Split(int now,int k,int &x,int &y){
if(!now){
x=y=0;
}else{
if(ky[now]<=k){
x=CopyNode(now);
Split(ch[x][1],k,ch[x][1],y);
pushup(x);
}else{
y=CopyNode(now);
Split(ch[y][0],k,x,ch[y][0]);
pushup(y);
}
}
} void Del(int &rt,int val){
int x,y,z;
Split(rt,val,x,z);
Split(x,val-1,x,y);
y=Mer(ch[y][0],ch[y][1]);
rt=Mer(Mer(x,y),z);
}
void Ins(int &rt,int val){
int x,y,z;
Split(rt,val,x,y);
rt=Mer(Mer(x,NewNode(val)),y);
}
int Kth(int x,int k){
while(x){
int l=ch[x][0];
if(k<=siz[l]){
x=ch[x][0];
}else if(k>siz[l]+1){
k-=(siz[l]+1);
x=ch[x][1];
}else{
return ky[x];
}
}
}
int Rank(int x,int val){
int ret=0;
while(x){
if(ky[x]<val){
ret+=siz[ch[x][0]]+1;
x=ch[x][1];
}else if(ky[x]>val){
x=ch[x][0];
}else{
ret+=siz[ch[x][0]];break;
}
}
return ret+1;
}
int Getpre(int x,int val){
int ret=oo;
while(x){
if(ky[x]<val){
ret=ky[x];
x=ch[x][1];
}else{
x=ch[x][0];
}
}
return ret;
}
int Getsuc(int x,int val){
int ret=-oo;
while(x){
if(ky[x]>val){
ret=ky[x];
x=ch[x][0];
}else{
x=ch[x][1];
}
}
return ret;
} void check(int x){
if(ch[x][0])check(ch[x][0]);
cout<<ky[x]<<' ';
if(ch[x][1])check(ch[x][1]);
} int main(){
scanf("%d",&T);
for(int i=1;i<=T;++i){
int opty,pre,a;
scanf("%d%d%d",&pre,&opty,&a);
root[i]=root[pre];
if(opty==1)Ins(root[i],a);
if(opty==2)Del(root[i],a);
if(opty==3)printf("%d\n",Rank(root[i],a));
if(opty==4)printf("%d\n",Kth(root[i],a));
if(opty==5)printf("%d\n",Getpre(root[i],a));
if(opty==6)printf("%d\n",Getsuc(root[i],a));
// check(root[i]);
// cout<<endl;
}
return 0;
}
luogu P3835 【模板】可持久化平衡树的更多相关文章
- luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树)(主席树)
luogu P3919 [模板]可持久化数组(可持久化线段树/平衡树) 题目 #include<iostream> #include<cstdlib> #include< ...
- luoguP3835 [模板]可持久化平衡树
https://www.luogu.org/problemnew/show/P3835 因为博主精力和实力有限,学不懂 fhq treap 了,因此只介绍 leafy tree 解法 leafy tr ...
- 洛谷.3835.[模板]可持久化平衡树(fhq treap)
题目链接 对每次Merge(),Split()时产生的节点都复制一份(其实和主席树一样).时间空间复杂度都为O(qlogq).(应该更大些 因为rand()?内存真的爆炸..) 对于无修改的操作实际上 ...
- 2021.07.02 P1383 高级打字机题解(可持久化平衡树)
2021.07.02 P1383 高级打字机题解(可持久化平衡树) 分析: 从可以不断撤销并且查询不算撤销这一骚操作可以肯定这是要咱建一棵可持久化的树(我也只会建可持久化的树,当然,还有可持久化并查集 ...
- Luogu P3835 【模板】可持久化平衡树(fhq Treap)
P3835 [模板]可持久化平衡树 题意 题目背景 本题为题目普通平衡树的可持久化加强版. 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本 ...
- [Luogu 3835]【模板】可持久化平衡树
Description 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作 ...
- 洛谷P3835 【模板】可持久化平衡树
题目背景 本题为题目 普通平衡树 的可持久化加强版. 数据已经经过强化 感谢@Kelin 提供的一组hack数据 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作( ...
- P3835 【模板】可持久化平衡树
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作(对于各个以往的历史版本): 插入x数 删除x数(若有多个相同的数,因只删除一个,如果没有请忽略该操作) 查询x数的 ...
- [luogu P3369]【模板】普通平衡树(Treap/SBT)
[luogu P3369][模板]普通平衡树(Treap/SBT) 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删 ...
- 数组splay ------ luogu P3369 【模板】普通平衡树(Treap/SBT)
二次联通门 : luogu P3369 [模板]普通平衡树(Treap/SBT) #include <cstdio> #define Max 100005 #define Inline _ ...
随机推荐
- 51nod 1276:岛屿的数量 很好玩的题目
1276 岛屿的数量 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题 收藏 取消关注 有N个岛连在一起形成了一个大的岛屿,如果海平 ...
- Nachos-Lab2-线程调度模块实现
源码获取 https://github.com/icoty/nachos-3.4-Lab 内容一:总体概述 本实习希望通过修改Nachos系统平台的底层源代码,达到"扩展调度算法" ...
- SpringBoot#InitBinder
__震惊!!我的天啦,OMG!! 1. initBinder对我而言的价值在于,通过传统表单post数据到后端的controller时候,数据类型的自动转换.比如前端页面填写一个日期字符串,通过Ini ...
- Kaggle: House Prices: Advanced Regression Techniques
Kaggle: House Prices: Advanced Regression Techniques notebook来自https://www.kaggle.com/neviadomski/ho ...
- HDU 5477: A Sweet Journey
A Sweet Journey Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others) ...
- 19 — node 模块化 及 CommonJS规范 — CommonJS 的由来及各组织与 JS 的关系
ECMAScript 对于不同的环境(运行平台),设计结构,理念,使用方式大相径庭. 1,浏览器 :DOM BOM 2,NodeJS :FS,HTTP 内置模块 : 第三方模块 : 内置模块 3, ...
- 十五、CI框架之自动加载数据库
一.在config的autoload.php文件中,如果写入以下代码,那么在控制器中无需再次加载数据库了,相当于全局自动加载数据库了 不忘初心,如果您认为这篇文章有价值,认同作者的付出,可以微信二维码 ...
- Swift - UISplitViewController
https://blog.csdn.net/weixin_43704791/article/details/86424080 2019年01月13日 AppDelegate中: func applic ...
- POJ 1422 DAG最小路径覆盖
求无向图中能覆盖每个点的最小覆盖数 单独的点也算一条路径 这个还是可以扯到最大匹配数来,原因跟上面的最大独立集一样,如果某个二分图(注意不是DAG上的)的边是最大匹配边,那说明只要取两个端点只要一条边 ...
- Python String startswith() Method
一,摘自官方API https://docs.python.org/3/library/stdtypes.html#methods str.startswith(prefix[, start[, e ...