非旋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 }
转载请标明出处 http://www.cnblogs.com/cyz666/