标签:
bzoj3224:普通平衡树,照着模板打$_$。。。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; #define rep(i,n) for(int i=1;i<=n;i++) #define clr(x,c) memset(x,c,sizeof(x)) int read(){ int x=0;char c=getchar();bool f=true; while(!isdigit(c)){ if(c==‘-‘) f=false;c=getchar(); } while(isdigit(c)) x=x*10+c-‘0‘,c=getchar(); return f?x:-x; } struct data{ int l,r,v,size,rnd,w; }t[100005]; int size,root,ans,n; void update(int x){ t[x].size=t[t[x].l].size+t[t[x].r].size+t[x].w; } void lturn(int &x){ int tmp=t[x].r;t[x].r=t[tmp].l;t[tmp].l=x; t[tmp].size=t[x].size;update(x);x=tmp; } void rturn(int &x){ int tmp=t[x].l;t[x].l=t[tmp].r;t[tmp].r=x; t[tmp].size=t[x].size;update(x);x=tmp; } void insert(int &k,int x){ if(k==0){ size++;k=size; t[k].size=t[k].w=1;t[k].v=x;t[k].rnd=rand();return ; } t[k].size++; if(t[k].v==x) t[k].w++; else if(t[k].v<x){ insert(t[k].r,x);if(t[t[k].r].rnd<t[k].rnd) lturn(k); }else{ insert(t[k].l,x);if(t[t[k].l].rnd<t[k].rnd) rturn(k); } } void del(int &k,int x){ if(k==0) return ; if(t[k].v==x){ if(t[k].w>1) { t[k].w--;t[k].size--;return ; } if(t[k].l*t[k].r==0) k=t[k].l+t[k].r; else if(t[t[k].l].rnd<t[t[k].r].rnd) rturn(k),del(k,x); else lturn(k),del(k,x); }else if(x>t[k].v) t[k].size--,del(t[k].r,x); else t[k].size--,del(t[k].l,x); } int queryrank(int k,int x){ if(k==0) return 0; if(t[k].v==x) return t[t[k].l].size+1; else if(t[k].v>x) return queryrank(t[k].l,x); else return t[t[k].l].size+t[k].w+queryrank(t[k].r,x); } int querynum(int k,int x){ if(k==0) return 0; if(x<=t[t[k].l].size) return querynum(t[k].l,x); else if(x>t[t[k].l].size+t[k].w) return querynum(t[k].r,x-t[t[k].l].size-t[k].w); else return t[k].v; } void querypro(int k,int x){ if(k==0) return ; if(t[k].v<x) ans=k,querypro(t[k].r,x); else querypro(t[k].l,x); } void querysub(int k,int x){ if(k==0) return ; if(t[k].v>x) ans=k,querysub(t[k].l,x); else querysub(t[k].r,x); } int main(){ int n=read(); rep(i,n){ int p=read(),x=read(); if(p==1) insert(root,x); else if(p==2) del(root,x); else if(p==3) printf("%d\n",queryrank(root,x)); else if(p==4) printf("%d\n",querynum(root,x)); else if(p==5) ans=0,querypro(root,x),printf("%d\n",t[ans].v); else ans=0,querysub(root,x),printf("%d\n",t[ans].v); } return 0; }
标签:
原文地址:http://www.cnblogs.com/fighting-to-the-end/p/5639987.html