非旋treap (BZOJ1895)

记个板子,还是挺好用的。

  1 #include <bits/stdc++.h>
  2 using namespace std;
  3 char op[10]; int rt,n,m,l,r,x,A,B,C,t;
  4 struct O{
  5     int l,r,x,m,o,s,v;
  6 }a[300005];
  7 void up(int u){
  8     a[u].s=a[a[u].l].s+a[a[u].r].s+1;
  9     a[u].m=min(a[a[u].l].m,a[a[u].r].m);
 10     a[u].m=min(a[u].m,a[u].v);
 11 }
 12 void build(int &u,int l,int r){
 13     if (l>r) return;
 14     u=l+r>>1;
 15     if (l<=r)
 16         build(a[u].l,l,(l+r>>1)-1),
 17         build(a[u].r,(l+r>>1)+1,r);
 18     up(u);
 19 }
 20 void down(int u){
 21     int l=a[u].l,r=a[u].r;
 22     if (a[u].x){
 23         if (l) a[l].x+=a[u].x,
 24             a[l].m+=a[u].x,a[l].v+=a[u].x;
 25         if (r) a[r].x+=a[u].x,
 26             a[r].m+=a[u].x,a[r].v+=a[u].x;
 27         a[u].x=0;
 28     }
 29     if (a[u].o){
 30         if (l) a[l].o^=1,swap(a[l].l,a[l].r);
 31         if (r) a[r].o^=1,swap(a[r].l,a[r].r);
 32         a[u].o=0;
 33     }
 34 }
 35 void split(int u,int k,int &l,int &r){
 36     if (!k) {l=0; r=u; return;}
 37     if (k==a[u].s) {l=u; r=0; return;}
 38     down(u);
 39     if (k<=a[a[u].l].s) r=u,split(a[u].l,k,l,a[u].l);
 40     else l=u,split(a[u].r,k-a[a[u].l].s-1,a[u].r,r);
 41     up(u);
 42 }
 43 int merge(int l,int r){
 44     if (!l||!r) return l+r;
 45     if (1ll*rand()*(a[l].s+a[r].s)<1ll*RAND_MAX*a[l].s){
 46         down(l); a[l].r=merge(a[l].r,r); up(l); return l;
 47     }else{
 48         down(r); a[r].l=merge(l,a[r].l); up(r); return r;
 49     }
 50 }
 51 int main(){
 52     scanf("%d",&n); a[0].m=2147483637;
 53     for (int i=1;i<=n;++i)
 54         scanf("%d",&a[i].v),a[i].m=a[i].v;
 55     t=n; build(rt,1,n);
 56     scanf("%d",&m);
 57     while (m--){
 58         scanf("%s",op);
 59         if (op[0]=='A'){//add
 60             scanf("%d%d%d",&l,&r,&x);
 61             split(rt,r,B,C);
 62             split(B,l-1,A,B);
 63             a[B].x+=x; a[B].m+=x; a[B].v+=x;
 64             rt=merge(merge(A,B),C);
 65         }else
 66         if (op[0]=='D'){//delete
 67             scanf("%d",&x);
 68             split(rt,x,B,C);
 69             split(B,x-1,A,B);
 70             rt=merge(A,C);
 71         }else
 72         if (op[0]=='M'){//min 
 73             scanf("%d%d",&l,&r);
 74             split(rt,r,B,C);
 75             split(B,l-1,A,B);
 76             printf("%d\n",a[B].m);
 77             rt=merge(merge(A,B),C);
 78         }else
 79         if (op[0]=='I'){//insert
 80             scanf("%d%d",&l,&x);
 81             split(rt,l,A,C);
 82             a[++t].s=1; a[t].m=a[t].v=x;
 83             rt=merge(merge(A,t),C);
 84         }else
 85         if (op[3]=='E'){//reverse
 86             scanf("%d%d",&l,&r);
 87             split(rt,r,B,C);
 88             split(B,l-1,A,B);
 89             a[B].o^=1; swap(a[B].l,a[B].r);
 90             rt=merge(merge(A,B),C);
 91         }else{//revolve
 92             scanf("%d%d%d",&l,&r,&x);
 93             x%=r-l+1;
 94             split(rt,r,B,C);
 95             split(B,l-1,A,B);
 96             split(B,r-l+1-x,l,r);
 97             rt=merge(merge(A,r),merge(l,C));
 98         }
 99     }
100     return 0;
101 }
Hanser!!

 

posted @ 2017-11-06 10:09  cyz666  阅读(171)  评论(0编辑  收藏  举报