zoukankan      html  css  js  c++  java
  • 非旋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
    ",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!!
  • 相关阅读:
    HTML总结
    Java 基础知识总结 (三、运算符)
    关于JS 事件冒泡和onclick,click,on()事件触发顺序
    Java 基础知识总结 (四、String)
    Java 基础知识总结 (二、基本数据类型)
    websocket实例(显示文件导入处理进度)
    Java 基础知识总结 (一、标识符)
    Java Calendar 注意事项
    Ajax调用SpringMVC ModelAndView 无返回情况
    关于Ajax load页面中js部分$(function(){})的执行顺序
  • 原文地址:https://www.cnblogs.com/cyz666/p/7791849.html
Copyright © 2011-2022 走看看