zoukankan      html  css  js  c++  java
  • poj3580 序列之王 fhqtreap

    fhqtreap的写法 操作其实都差不多哇

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int M=200050;
    int read(){
        int ans=0,f=1,c=getchar();
        while(c<'0'||c>'9'){if(c=='-') f=-1; c=getchar();}
        while(c>='0'&&c<='9'){ans=ans*10+(c-'0'); c=getchar();}
        return ans*f;
    }
    int n,m,sum;
    struct node{
        node *l,*r;
        int sz,v,rnd,rev,tag,mn;
        void init(int w){sz=1; v=w; rnd=rand(); mn=w;}
        void add(int w){tag+=w; v+=w; mn+=w;}
        void revs(){rev^=1; swap(l,r);}
        void up(){
            sz=1; mn=v;
            if(l) sz+=l->sz,mn=min(mn,l->mn);
            if(r) sz+=r->sz,mn=min(mn,r->mn);
        }
        void dn(){
            if(rev){if(l) l->revs(); if(r) r->revs(); rev=0;}
            if(tag){if(l) l->add(tag); if(r) r->add(tag); tag=0;}
        }
        void split(node*&lw,node*&rw,int k){
            if(!this){lw=0; rw=0; return ;}
            dn();
            int ls=l?l->sz:0;
            if(ls>=k){
                l->split(lw,l,k);
                rw=this;
            }
            else{
                r->split(r,rw,k-ls-1);
                lw=this;
            }
            up();
        }
    }tr[M],*rt;
    node *merge(node *a,node *b){
        if(!a) return b;
        if(!b) return a;
        if(a->rnd>b->rnd){
            a->dn();
            a->r=merge(a->r,b);
            a->up();
            return a;
        }{
            b->dn();
            b->l=merge(a,b->l);
            b->up();
            return b;
        }
    }
    int main()
    {
        int l,r,w;
        char ch[15];
        n=read();
        for(int i=1;i<=n;i++) w=read(),tr[i].init(w),rt=merge(rt,tr+i);
        sum=n; m=read();
        while(m--){
            scanf("%s",ch);
            if(ch[0]=='A'){
                node *p1,*p2,*p3;
                l=read(); r=read(); w=read();
                rt->split(p2,p3,r);
                p2->split(p1,p2,l-1);
                p2->add(w);
                rt=merge(merge(p1,p2),p3);
            }
            else if(ch[0]=='M'){
                node *p1,*p2,*p3;
                l=read(); r=read();
                rt->split(p2,p3,r);
                p2->split(p1,p2,l-1);
                printf("%d
    ",p2->mn);
                rt=merge(merge(p1,p2),p3);
            }
            else if(ch[0]=='R'&&ch[4]=='R'){
                node *p1,*p2,*p3;
                l=read(); r=read();
                if(l==r) continue;
                rt->split(p2,p3,r);
                p2->split(p1,p2,l-1);
                p2->revs();
                rt=merge(merge(p1,p2),p3);
            }
            else if(ch[3]=='O'){
                node *p1,*p2,*p3,*p4;
                l=read(); r=read(); w=read()%(r-l+1);
                if(l==r) continue;
                rt->split(p2,p4,r);
                p2->split(p1,p2,l-1);
                p2->split(p2,p3,r-w-l+1);
                rt=merge(merge(p1,p3),merge(p2,p4));
            }
            else if(ch[0]=='I'){
                node *p1,*p2;
                l=read(); w=read();
                tr[++sum].init(w);
                rt->split(p1,p2,l);
                rt=merge(merge(p1,tr+sum),p2);
            }
            else if(ch[0]=='D'){
                node *p1,*p2,*p3; 
                l=read();
                rt->split(p2,p3,l);
                p2->split(p1,p2,l-1);
                rt=merge(p1,p3);
            }
        }
        return 0;
    }
    View Code
  • 相关阅读:
    20150826运算符,if语句
    20150825数据类型以及数据转换
    !!!SQL sever 函数表达
    SQL
    !!!遍历数组之多维数组!
    数组应用之————二分法查找
    数组-冒泡排列
    Homework!---判断多久过生日
    C#——语句!
    C#——语言基础 之 运算符!
  • 原文地址:https://www.cnblogs.com/lyzuikeai/p/6937286.html
Copyright © 2011-2022 走看看