BZOJ - 3224 Tyvj 1728 普通平衡树 (treap/树状数组)
treap及树状数组模板题。
treap版:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 typedef double db; 5 const int N=1e5+10,inf=0x7fffffff; 6 int m,ch[N][2],val[N],siz[N],rd[N],tot,rt; 7 void pu(int u) {siz[u]=siz[ch[u][0]]+siz[ch[u][1]]+1;} 8 void rot(int& u,int f) { 9 int v=ch[u][f]; 10 ch[u][f]=ch[v][f^1],ch[v][f^1]=u; 11 pu(u),pu(v),u=v; 12 } 13 int newnode(int x) {int u=++tot; ch[u][0]=ch[u][1]=0,val[u]=x,siz[u]=1,rd[u]=rand(); return u;} 14 void ins(int& u,int x) { 15 if(!u) {u=newnode(x); return;} 16 int f=x>val[u]; 17 ins(ch[u][f],x); 18 if(rd[ch[u][f]]>rd[u])rot(u,f); 19 if(u)pu(u); 20 } 21 void del(int& u,int x) { 22 if(val[u]==x) { 23 if(!ch[u][0])u=ch[u][1]; 24 else if(!ch[u][1])u=ch[u][0]; 25 else { 26 int f=rd[ch[u][1]]>rd[ch[u][0]]; 27 rot(u,f),del(ch[u][f^1],x); 28 } 29 } else del(ch[u][x>val[u]],x); 30 if(u)pu(u); 31 } 32 int lb(int u,int x) { 33 int ret=0; 34 for(; u; u=ch[u][x>val[u]])if(val[u]<x)ret=val[u]; 35 return ret; 36 } 37 int ub(int u,int x) { 38 int ret=0; 39 for(; u; u=ch[u][x>=val[u]])if(val[u]>x)ret=val[u]; 40 return ret; 41 } 42 int rnk(int u,int x) { 43 int ret=0; 44 for(; u; u=ch[u][x>val[u]]) { 45 if(x>val[u])ret+=siz[ch[u][0]]+1; 46 } 47 return ret+1; 48 } 49 int kth(int u,int k) { 50 while(k!=siz[ch[u][0]]+1) { 51 if(k<siz[ch[u][0]]+1)u=ch[u][0]; 52 else k-=siz[ch[u][0]]+1,u=ch[u][1]; 53 } 54 return val[u]; 55 } 56 int main() { 57 srand(time(0)); 58 ins(rt,~inf),ins(rt,inf); 59 scanf("%d",&m); 60 while(m--) { 61 int f,x; 62 scanf("%d%d",&f,&x); 63 if(f==1)ins(rt,x); 64 else if(f==2)del(rt,x); 65 else if(f==3)printf("%d\n",rnk(rt,x)-1); 66 else if(f==4)printf("%d\n",kth(rt,x+1)); 67 else if(f==5)printf("%d\n",lb(rt,x)); 68 else if(f==6)printf("%d\n",ub(rt,x)); 69 } 70 return 0; 71 }
树状数组版:
1 #include<bits/stdc++.h> 2 using namespace std; 3 typedef long long ll; 4 const int N=1e5+10,inf=0x3f3f3f3f; 5 int m,n,n2,b[N],c[N],Log[N],hb[N]; 6 int lb(int x) {return x&-x;} 7 void add(int u,int x) {for(; u<=n2; u+=lb(u))c[u]+=x;} 8 int get(int u) {int ret=0; for(; u; u-=lb(u))ret+=c[u]; return ret;} 9 int kth(int k) {int ret=0; for(int i=hb[n2]; i; i>>=1)if(ret+i<=n2&&c[ret+i]<k)k-=c[ret+=i]; return ret+1;} 10 struct Q {int f,x;} qr[N]; 11 int main() { 12 hb[1]=1; 13 for(int i=2; i<N; ++i)hb[i]=hb[i>>1]<<1; 14 scanf("%d",&m); 15 for(int i=0; i<m; ++i)scanf("%d%d",&qr[i].f,&qr[i].x); 16 for(int i=0; i<m; ++i)if(qr[i].f!=4)b[n2++]=qr[i].x; 17 sort(b,b+n2),n2=unique(b,b+n2)-b; 18 for(int i=0; i<m; ++i)if(qr[i].f!=4)qr[i].x=lower_bound(b,b+n2,qr[i].x)-b+1; 19 for(int i=0; i<m; ++i) { 20 int f=qr[i].f,x=qr[i].x; 21 if(f==1)add(x,1); 22 else if(f==2)add(x,-1); 23 else if(f==3)printf("%d\n",get(x-1)+1); 24 else if(f==4)printf("%d\n",b[kth(x)-1]); 25 else if(f==5)printf("%d\n",b[kth(get(x-1))-1]); 26 else if(f==6)printf("%d\n",b[kth(get(x)+1)-1]); 27 } 28 return 0; 29 }