Portal: http://www.lydsy.com/JudgeOnline/problem.php?id=1901
Puzzle: Tree set tree, line segment Tree +treap (SB I think there are many sets of data ...) Uh-huh, Crazy re)
#include <iostream>#include<cstring>#include<cmath>#include<algorithm>#include<cstdio>#defineN 200001#defineM 1300001#defineINF 1000000000using namespacestd;intN,m,sz,ans,a[n];intLs[m],rs[m],rnd[m],v[m],s[m],w[m];intRoot[n];intRead () {intx=0;CharChBOOLdo{0; while(Ch=getchar (),ch<'0'|| Ch>'9')if(ch=='-') bo=1; while(x=x*Ten+ch-'0', Ch=getchar (), ch>='0'&&ch<='9'); if(BO)return-X;returnx;}voidUpdata (intk) {s[k]=s[ls[k]]+s[rs[k]]+w[k];}voidRturn (int&k) {intT=LS[K]; LS[K]=RS[T]; Rs[t]=k; S[T]=S[K]; Updata (k); k=t;}voidLturn (int&k) {intT=RS[K]; RS[K]=LS[T]; Ls[t]=k; S[T]=S[K]; Updata (k); k=t;}voidInsertint&k,intnum) { if(!k) {K=++sz; s[k]=w[k]=1; V[k]=num; Rnd[k]=rand ();return;} S[K]++; if(V[k]==num) w[k]++; Else if(V[k]>num) {Insert (ls[k],num);if(rnd[ls[k]]<Rnd[k]) Rturn (k);} Else{Insert (rs[k],num);if(rnd[rs[k]]<Rnd[k]) Lturn (k);}}voidDelint&k,intnum) { if(v[k]==num) { if(w[k]>1) {w[k]--; s[k]--;return;} if(ls[k]*rs[k]==0) k=ls[k]+Rs[k]; Else if(rnd[ls[k]]<Rnd[rs[k]]) {Rturn (k); del (k,num);} Else{Lturn (k); del (k,num);} } Else if(V[k]<num) {del (rs[k],num); s[k]--;} Else{del (ls[k],num); s[k]--;}}voidBuildintKintLintRintPosintval) {Insert (root[k],val); intMid= (l+r) >>1; if(L==R)return; if(Pos<=mid) Build (k*2, L,mid,pos,val); ElseBuild (k*2+1, mid+1, R,pos,val);}voidChange (intKintLintRintPosintValintpre) {del (ROOT[K],PRE); Insert (Root[k],val); if(L==R)return; intMid= (l+r) >>1; if(pos<=mid) Change (k*2, L,mid,pos,val,pre); ElseChange (k*2+1, mid+1, R,pos,val,pre);}voidAsk_rank (intKintnum) { if(!k)return; if(Num==v[k]) {Ans+=s[ls[k]];return;} Else if(v[k]>num) {Ask_rank (ls[k],num);} Else{ans+=s[ls[k]]+w[k]; Ask_rank (rs[k],num);} }voidQuery_rank (intKintLintRintXintYintnum) { if(L==x && y==r) {Ask_rank (root[k],num);return;} intMid= (l+r) >>1; if(Y<=mid) Query_rank (k*2, L,mid,x,y,num); Else if(mid<x) Query_rank (k*2+1, mid+1, R,x,y,num); Else{Query_rank (k*2, L,mid,x,mid,num); Query_rank (k*2+1, mid+1, r,mid+1, Y,num); } }voidQuery_k (intXintYintnum) { intL=0, r=inf,tmp; while(l<r) {intMid= (l+r) >>1; ans=1; Query_rank (1,1, N,x,y,mid); if(Ans>num) r=mid; Else{l=mid+1; tmp=Mid;} } printf ("%d\n", TMP);}intMain () {memset (root,0,sizeof(root)); memset (LS,0,sizeof(LS)); memset (RS,0,sizeof(RS)); memset (s),0,sizeof(s)); Memset (W,0,sizeof(w)); SZ=0; N=read (); m=read (); for(intI=1; i<=n; i++) a[i]=read (); for(intI=1; i<=n; i++) Build (1,1, N,i,a[i]); Charch[Ten]; intL,r,k,pos,val; for(intI=1; i<=m; i++) {scanf ("%s", CH); if(ch[0]=='Q') {l=read (); R=read (); K=read (); ans=1; Query_k (l,r,k);} if(ch[0]=='C') {pos=read (); Val=read (); Change (1,1, N,pos,val,a[pos]); a[pos]=Val;} } }View Code
bzoj1901:zju2112 Dynamic Rankings