非旋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 }
雲珠桜

 

posted @ 2017-12-14 16:17  cyz666  阅读(331)  评论(0编辑  收藏  举报