社区讨论
FHQTreap求调 44pts
P3369【模板】普通平衡树参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo0ztfdp
- 此快照首次捕获于
- 2023/10/22 12:53 2 年前
- 此快照最后确认于
- 2023/11/02 12:23 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int ls[N],rs[N],val[N],pri[N],size[N],cnt,root=0,n,opt;
int inline read() {
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9') {
if(ch=='-')f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') {
x=x*10+ch-'0';
ch=getchar();
}
return x*f;
}
void update(int p){
size[p]=1+size[ls[p]]+size[rs[p]];
}
int new_node(int v){
size[++cnt]=1;
val[cnt]=v;
pri[cnt]=rand();
return cnt;
}
void split(int now,int k,int &x,int &y){
if(!now)x=y=0;
else{
if(val[now]<=k){
x=now;
split(rs[now],k,rs[now],y);
}
else{
y=now;
split(ls[now],k,x,ls[now]);
}
update(now);
}
}
int merge(int x,int y){
if(!x || !y)return x+y;
if(pri[x]<pri[y]){
rs[x]=merge(rs[x],y);
update(x);
return x;
}
else{
ls[y]=merge(x,ls[y]);
update(y);
return y;
}
}
int kth(int now,int k){
while(1){
if(k<=size[ls[now]])now=ls[now];
else if(k==size[ls[now]]+1)return now;
else{
k-=size[ls[now]]+1;
now=rs[now];
}
}
}
int main() {
srand((unsigned)time(NULL));
n=read();
int x,y,a,z;
for(int i=1;i<=n;i++){
opt=read();a=read();
switch(opt){
case 1:{
split(root,a,x,y);
root=merge(merge(x,new_node(a)),y);
break;
}
case 2:{
split(root,a,x,z);
split(root,a-1,x,y);
y=merge(ls[y],rs[y]);
root=merge(merge(x,y),z);
break;
}
case 3:{
split(root,a-1,x,y);
printf("%d\n",size[x]+1);//cout<<<<endl;
root=merge(x,y);
break;
}
case 4:{
printf("%d\n",val[kth(root,a)]);//cout<<<<endl;
break;
}
case 5:{
split(root,a-1,x,y);
printf("%d\n",val[kth(x,size[x])]);//cout<<<<endl;
root=merge(x,y);
break;
}
case 6:{
split(root,a,x,y);
printf("%d\n",val[kth(y,1)]);
root=merge(x,y);
break;
}
}
}
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...