如题,代码如下:
#include<bits/stdc++.h>
using namespace std;
const int N=100005;
int cnt=0;
struct node{
int l,r,key,pri,size;
}t[N];
void pushup(int p){
t[p].size=t[t[p].l].size+t[t[p].r].size+1;
}
void newnode(int d){
cnt++;
t[cnt].size=1;
t[cnt].l=t[cnt].r=0;
t[cnt].key=d;
t[cnt].pri=rand();
}
void xuan(int &p,int d){
int k;
if(d==1){
k=t[p].r;
t[p].r=t[k].l;
t[k].l=p;
}
else{
k=t[p].l;
t[p].l=t[k].r;
t[k].r=p;
}
t[k].size=t[p].size;
pushup(p);
p=k;
}
void add(int &p,int d){
if(p==0){
newnode(d);
p=cnt;
return;
}
t[p].size++;
if(d>=t[p].key) add(t[p].r,d);
else add(t[p].l,d);
if(t[p].l!=0&&t[p].pri>t[t[p].l].pri) xuan(p,0);
if(t[p].r!=0&&t[p].pri>t[t[p].r].pri) xuan(p,1);
pushup(p);
}
void del(int &p,int d){
t[p].size--;
if(t[p].key==d){
if(t[p].l==0&&t[p].r==0){
p=0;
return;
}
if(t[p].l==0||t[p].r==0){
p=t[p].l+t[p].r;
return;
}
if(t[t[p].l].pri<t[t[p].r].pri){
xuan(p,0);
del(t[p].r,d);
return;
}
else{
xuan(p,1);
del(t[p].l,d);
return;
}
}
if(t[p].key>=d) del(t[p].l,d);
else del(t[p].r,d);
pushup(p);
}
int Rank(int p,int d){
if(p==0) return 0;
if(d>t[p].key) return t[t[p].l].size+Rank(t[p].r,d)+1;
return Rank(t[p].l,d);
}
int kth(int p,int d){
if(d==t[t[p].l].size+1) return t[p].key;
if(d>t[t[p].l].size+1) return kth(t[p].r,d-t[t[p].l].size-1);
if(d<=t[t[p].l].size) kth(t[p].l,d);
}
int getqian(int p,int d){
if(p==0) return 0;
if(t[p].key>=d) return getqian(t[p].l,d);
int tmp=getqian(t[p].r,d);
if(tmp==0) return t[p].key;
return tmp;
}
int gethou(int p,int d){
if(p==0) return 0;
if(t[p].key<=d) return gethou(t[p].r,d);
int tmp=gethou(t[p].l,d);
if(tmp==0) return t[p].key;
return tmp;
}
int main(){
//freopen("P3369_3.in","r",stdin);
//freopen("111.out","w",stdout);
//srand(time(NULL));
int num=0,n;
scanf("%d",&n);
while(n--){
int flag,d;
scanf("%d%d",&flag,&d);
if(flag==1) add(num,d);
if(flag==2) del(num,d);
if(flag==3) printf("%d\n",Rank(num,d)+1);
if(flag==4) printf("%d\n",kth(num,d));
if(flag==5) printf("%d\n",getqian(num,d));
if(flag==6) printf("%d\n",gethou(num,d));
}
return 0;
}
交了十几次一会儿错一会儿对,才发现每次AC的时候没开O2
这氧是不是有毒啊
想知道原因