首页 > 代码库 > poj3580 序列之王 fhqtreap

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\n",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

 

poj3580 序列之王 fhqtreap