非旋treap套线段树
BZOJ3065。
去年用pascal 块链过了。。
今年来试了试非旋treap大法 注定被块链完爆
代码留这。
第一份 :辣鸡的 垃圾回收做法 跑得极慢
1 #include <bits/stdc++.h> 2 #define M 70000 3 using namespace std; 4 struct W{int l,r,s,v,e;}a[70005]; 5 struct O{int l,r,s,k;}b[15000000]; 6 int nex[15000000],A[35005],n,m,rt,ans,l,r,x,k,t,c,T,d[70005]; char op[3]; 7 void CL(int u){ 8 if (!u) return; --b[u].k; 9 if (!b[u].k) nex[u]=t,t=u; 10 } 11 void NEW(int &u){ 12 int U=t; t=nex[t]; CL(u); 13 CL(b[U].l); CL(b[U].r); 14 b[U]=(O){b[u].l,b[u].r,b[u].s,1}; 15 u=U; ++b[b[u].l].k; ++b[b[u].r].k; 16 } 17 void add(int &u,int x,int p,int q,int X){ 18 NEW(u); b[u].s+=X; 19 if (p<q) 20 if (x<=p+q>>1) add(b[u].l,x,p,p+q>>1,X); 21 else add(b[u].r,x,(p+q>>1)+1,q,X); 22 if (!b[u].s) {nex[u]=t; t=u; u=0;} 23 } 24 void he(int &u,int v,int p,int q){ 25 if (!v) return; 26 if (!u) {++b[u=v].k; return;} 27 NEW(u); b[u].s+=b[v].s; 28 he(b[u].l,b[v].l,p,p+q>>1); 29 he(b[u].r,b[v].r,(p+q>>1)+1,q); 30 } 31 void up(int u){ 32 a[u].s=a[a[u].l].s+a[a[u].r].s+1; 33 CL(a[u].e); a[u].e=0; 34 add(a[u].e,a[u].v,0,M,1); 35 he(a[u].e,a[a[u].l].e,0,M); 36 he(a[u].e,a[a[u].r].e,0,M); 37 } 38 void build(int &u,int p,int q){ 39 if (p>q) return; 40 u=p+q>>1; a[u].v=A[u]; 41 build(a[u].l,p,u-1); 42 build(a[u].r,u+1,q); 43 up(u); 44 } 45 void split(int u,int k,int &l,int &r){ 46 if (!k) {l=0; r=u; return;} 47 if (k==a[u].s) {l=u; r=0; return;} 48 if (k<=a[a[u].l].s) split(a[u].l,k,l,a[u].l),up(r=u); 49 else split(a[u].r,k-a[a[u].l].s-1,a[u].r,r),up(l=u); 50 } 51 void join(int &u,int k){ 52 if ((1ll+a[u].s)*rand()<=RAND_MAX){ 53 int A,B; split(u,k,A,B); 54 a[T].l=A; a[T].r=B; up(u=T); 55 }else{ 56 if (k<=a[a[u].l].s) join(a[u].l,k); 57 else join(a[u].r,k-a[a[u].l].s-1); 58 add(a[u].e,a[T].v,0,M,1); ++a[u].s; 59 } 60 } 61 void mody(int u,int k){ 62 if (a[a[u].l].s+1==k) 63 r=a[u].v,a[u].v=l; else 64 if (k<=a[a[u].l].s) mody(a[u].l,k); 65 else mody(a[u].r,k-a[a[u].l].s-1); 66 add(a[u].e,r,0,M,-1); 67 add(a[u].e,l,0,M,1); 68 } 69 void find(int u,int l,int r){ 70 if (r<1||l>a[u].s) return; 71 if (l<=1&&a[u].s<=r) {d[++c]=a[u].e; return;} 72 if (l<=a[a[u].l].s+1&&a[a[u].l].s<r) 73 add(d[1],a[u].v,0,M,1); 74 find(a[u].l,l,r); 75 find(a[u].r,l-a[a[u].l].s-1,r-a[a[u].l].s-1); 76 } 77 int main(){ 78 srand(233); 79 scanf("%d",&n); 80 for (int i=1;i<=n;++i) scanf("%d",&A[i]); 81 for (int i=1;i<15000000;++i) nex[i]=i+1; 82 t=1; build(rt,1,n); T=n; 83 scanf("%d",&m); 84 while (m--){ 85 scanf("%s",op); 86 if (op[0]=='Q'){ 87 scanf("%d%d%d",&l,&r,&k); 88 l^=ans; r^=ans; k^=ans; 89 c=1; find(rt,l,r); 90 l=0; r=M; int tt=d[1]; 91 while (l<r){ 92 x=0; 93 for (int i=1;i<=c;++i) x+=b[b[d[i]].l].s; 94 if (x<k){ 95 l=(l+r>>1)+1; k-=x; 96 for (int i=1;i<=c;++i) d[i]=b[d[i]].r; 97 }else{ 98 r=l+r>>1; 99 for (int i=1;i<=c;++i) d[i]=b[d[i]].l; 100 } 101 } 102 CL(tt); d[1]=0; 103 printf("%d\n",ans=l); 104 }else 105 if (op[0]=='M'){ 106 scanf("%d%d",&k,&l); 107 l^=ans; k^=ans; 108 mody(rt,k); 109 }else{ 110 scanf("%d%d",&l,&k); 111 l^=ans; k^=ans; --l; 112 ++T; a[T].v=k; 113 join(rt,l); 114 } 115 } 116 return 0; 117 }
第二份:暴力回收,暴力合并,快了许多
1 #include <bits/stdc++.h> 2 #define M 70000 3 #define S 15000000 4 using namespace std; 5 int D[S],rt,t,d[70005],m,x,l,r,k,n,ans,Q; char OP; 6 struct O{int l,r,s,v,e;}a[70005]; 7 struct U{int l,r,s;}b[S]; 8 void cl(int &u){ 9 if (!u) return; 10 cl(b[u].l); cl(b[u].r); 11 D[++t]=u; b[u].s=0; u=0; 12 } 13 void add(int &u,int p,int q,int x){ 14 if (!u) u=D[t--]; ++b[u].s; 15 if (p!=q) 16 if (x<=p+q>>1) add(b[u].l,p,p+q>>1,x); 17 else add(b[u].r,(p+q>>1)+1,q,x); 18 } 19 void del(int &u,int p,int q,int x){ 20 --b[u].s; 21 if (p!=q) 22 if (x<=p+q>>1) del(b[u].l,p,p+q>>1,x); 23 else del(b[u].r,(p+q>>1)+1,q,x); 24 if (!b[u].s) D[++t]=u,u=0; 25 } 26 int he(int l,int r){ 27 if (!l&&!r) return 0; 28 int u=D[t--]; 29 b[u].s=b[l].s+b[r].s; 30 b[u].l=he(b[l].l,b[r].l); 31 b[u].r=he(b[l].r,b[r].r); 32 return u; 33 } 34 void up(int u){ 35 a[u].s=a[a[u].l].s+a[a[u].r].s+1; 36 cl(a[u].e); 37 a[u].e=he(a[a[u].l].e,a[a[u].r].e); 38 add(a[u].e,0,M,a[u].v); 39 } 40 void build(int &u,int p,int q){ 41 if (p>q) return; 42 u=p+q>>1; 43 build(a[u].l,p,u-1); 44 build(a[u].r,u+1,q); 45 up(u); 46 } 47 void find(int u,int l,int r){ 48 if (r<1||l>a[u].s) return; 49 if (l<=1&&a[u].s<=r) {d[++m]=a[u].e; return;} 50 int i=a[a[u].l].s+1; 51 if (l<=i&&i<=r) 52 add(d[1],0,M,a[u].v); 53 find(a[u].l,l,r); 54 find(a[u].r,l-i,r-i); 55 } 56 void mody(int u){ 57 int i=a[a[u].l].s+1; 58 if (i==k) l=a[u].v,a[u].v=r; else 59 if (k<i) mody(a[u].l); 60 else k-=i,mody(a[u].r); 61 del(a[u].e,0,M,l); 62 add(a[u].e,0,M,r); 63 } 64 void split(int u,int k,int &l,int &r){ 65 if (!k) {l=0,r=u; return;} 66 if (k==a[u].s) {l=u,r=0; return;} 67 if (k<=a[a[u].l].s){ 68 split(a[u].l,k,l,a[u].l); up(r=u); 69 }else{ 70 split(a[u].r,k-a[a[u].l].s-1,a[u].r,r); up(l=u); 71 } 72 } 73 void join(int &u){ 74 if ((1ll+a[u].s)*rand()<=RAND_MAX){ 75 int A,B; split(u,k,A,B); 76 a[n].l=A; a[n].r=B; up(u=n); 77 }else{ 78 if (k<=a[a[u].l].s) join(a[u].l); 79 else k-=a[a[u].l].s+1,join(a[u].r); 80 add(a[u].e,0,M,a[n].v); ++a[u].s; 81 } 82 } 83 int main(){ 84 srand(23); 85 scanf("%d",&n); 86 for (int i=1;i<=n;++i) scanf("%d",&a[i].v); 87 for (int i=S-1;i;--i) D[i]=++t; 88 build(rt,1,n); 89 scanf("%d",&Q); 90 while (Q--){ 91 scanf("\n%c",&OP); 92 if (OP=='Q'){ 93 scanf("%d%d%d",&l,&r,&k); 94 l^=ans; r^=ans; k^=ans; 95 m=1; find(rt,l,r); 96 l=0; r=M; int tt=d[1]; 97 while (l<r){ 98 x=0; 99 for (int i=1;i<=m;++i) x+=b[b[d[i]].l].s; 100 if (x<k){ 101 l=(l+r>>1)+1; k-=x; 102 for (int i=1;i<=m;++i) d[i]=b[d[i]].r; 103 }else{ 104 r=l+r>>1; 105 for (int i=1;i<=m;++i) d[i]=b[d[i]].l; 106 } 107 } 108 cl(d[1]=tt); printf("%d\n",ans=l); 109 }else 110 if (OP=='M'){ 111 scanf("%d%d",&k,&r); 112 k^=ans; r^=ans; 113 mody(rt); 114 }else{ 115 scanf("%d%d",&k,&x); 116 k^=ans; a[++n].v=x^ans; 117 --k; join(rt); 118 } 119 } 120 return 0; 121 }
转载请标明出处 http://www.cnblogs.com/cyz666/