社区讨论
FHQ Treap MLE on #19,#20 求助
P3835【模板】可持久化平衡树参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lt9x394q
- 此快照首次捕获于
- 2024/03/02 18:05 2 年前
- 此快照最后确认于
- 2024/03/02 18:09 2 年前
CPP
#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5;
int n,root[maxn+5],tot;
struct node{
int lc,rc,val,key,siz;
}bt[maxn*20+5];
int newnode(int v){
bt[++tot].val=v,bt[tot].key=rand(),bt[tot].siz=1;
return tot;
}
void update(int x){
bt[x].siz=bt[bt[x].lc].siz+bt[bt[x].rc].siz+1;
}
void split(int x,int v,int &a,int &b){
if(x==0){
a=b=0;
return;
}
if(bt[x].val<=v){
a=newnode(bt[x].val),bt[a]=bt[x];
split(bt[a].rc,v,bt[a].rc,b);
update(a);
}
else{
b=newnode(bt[x].val),bt[b]=bt[x];
split(bt[b].lc,v,a,bt[b].lc);
update(b);
}
}
int merge(int a,int b){
if(a==0||b==0){
return a+b;
}
if(bt[a].key<bt[b].key){
int p=newnode(bt[a].val);
bt[p]=bt[a],bt[p].rc=merge(bt[p].rc,b);
update(p);
return p;
}
else{
int p=newnode(bt[b].val);
bt[p]=bt[b],bt[p].lc=merge(a,bt[p].lc);
update(p);
return p;
}
}
int kth(int x,int k){
if(bt[bt[x].lc].siz>=k){
return kth(bt[x].lc,k);
}
else if(bt[bt[x].lc].siz+1>=k){
return bt[x].val;
}
else{
return kth(bt[x].rc,k-bt[bt[x].lc].siz-1);
}
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
int op,id,x;
scanf("%d %d %d",&id,&op,&x);
root[i]=root[id];
int a,b,c;
if(op==1){
split(root[i],x,a,b);
root[i]=merge(merge(a,newnode(x)),b);
}
if(op==2){
split(root[i],x,a,c);
split(a,x-1,a,b);
b=merge(bt[b].lc,bt[b].rc),root[i]=merge(merge(a,b),c);
}
if(op==3){
split(root[i],x-1,a,b);
printf("%d\n",bt[a].siz+1);
root[i]=merge(a,b);
}
if(op==4){
printf("%d\n",kth(root[i],x));
}
if(op==5){
split(root[i],x-1,a,b);
if(bt[a].siz==0){
puts("-2147483647");
}
else{
printf("%d\n",kth(a,bt[a].siz));
}
root[i]=merge(a,b);
}
if(op==6){
split(root[i],x,a,b);
if(bt[b].siz==0){
puts("2147483647");
}
else{
printf("%d\n",kth(b,1));
}
root[i]=merge(a,b);
}
}
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...