用的FHQ Treap ,结果第一,二和最后一个点WA,其余全TLE,求大佬看看哪出问题。
#include<bits/stdc++.h>
using namespace std;
const int M=1e6+10;
int root=0,cnt=0;
struct Node{
int ls,rs,key,pri,size;
};
Node tree[M];
void update(int p){
tree[p].size=tree[tree[p].ls].size+tree[tree[p].rs].size;
}
void newnode(int x){
tree[++cnt].size=1;
tree[cnt].ls=0;
tree[cnt].rs=0;
tree[cnt].key=x;
tree[cnt].pri=rand();
}
int findk(int p,int k){
if(k==tree[tree[p].ls].size+1) return p;
if(k<=tree[tree[p].ls].size) return findk(tree[p].ls,k);
else return findk(tree[p].rs,k-tree[tree[p].ls].size-1);
}
void split(int p,int x,int &L,int &R){
if(p==0){
L=0;
R=0;
return;
}
if(tree[p].key<=x){
L=p;
split(tree[p].rs,x,tree[p].rs,R);
}
else{
R=p;
split(tree[p].ls,x,L,tree[p].ls);
}
update(p);
}
int merge(int L,int R){
if(L==0||R==0) return L+R;
if(tree[L].pri>tree[R].pri){
tree[L].rs=merge(tree[L].rs,R);
update(L);
return L;
}
else{
tree[R].ls=merge(L,tree[R].ls);
update(R);
return R;
}
}
void insert(int x){
int L,R;
split(root,x,L,R);
newnode(x);
int rp=merge(L,cnt);
root=merge(rp,R);
}
void del(int x){
int L,R,p;
split(root,x,L,R);
split(L,x-1,L,p);
p=merge(tree[p].ls,tree[p].rs);
root=merge(merge(L,p),R);
}
void rankx(int x){
int L,R;
split(root,x-1,L,R);
printf("%d\n",tree[L].size+1);
root=merge(L,R);
}
void prinx(int p,int k){
printf("%d\n",tree[findk(p,k)].key);
}
void prec(int x){
int L,R;
split(root,x-1,L,R);
prinx(L,tree[L].size);
root=merge(L,R);
}
void succ(int x){
int L,R;
split(root,x,L,R);
prinx(R,1);
root=merge(L,R);
}
int n,op,x;
int main(){
srand(time(NULL));
scanf("%d",&n);
while(n--){
scanf("%d%d",&op,&x);
switch(op){
case 1:insert(x);break;
case 2:del(x);break;
case 3:rankx(x);break;
case 4:prinx(root,x);break;
case 5:prec(x);break;
case 6:succ(x);break;
}
}
return 0;
}