码迷,mamicode.com
首页 > Windows程序 > 详细

AcWing266 超级备忘录(fhq-treap)

时间:2020-04-27 09:17:30      阅读:72      评论:0      收藏:0      [点我收藏+]

标签:void   模板   lap   pac   swap   scan   sed   show   space   

模板题:

技术图片
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int mod=1e9+7;
struct node{
    int l,r,key,mi,rnd,rev,add,size;
}tr[N];
int n,x,y,z,root,idx;
int get(int x){
    tr[++idx]={0,0,x,x,rand(),0,0,1};
    return idx;
}
void pushdown(int u){
    if(tr[u].rev){
        tr[tr[u].l].rev ^= 1, tr[tr[u].r].rev ^= 1;
        swap(tr[u].l, tr[u].r);
        tr[u].rev = 0;
    }
    if(tr[u].add){
        int x=tr[u].add;
        if(tr[u].l) tr[tr[u].l].key+=x,tr[tr[u].l].add+=x,tr[tr[u].l].mi+=x;
        if(tr[u].r) tr[tr[u].r].key+=x,tr[tr[u].r].add+=x,tr[tr[u].r].mi+=x;
        tr[u].add=0;
    }
}
void pushup(int p){
    tr[p].mi = min(tr[p].key, min(tr[tr[p].l].mi, tr[tr[p].r].mi));
    tr[p].size = tr[tr[p].l].size + tr[tr[p].r].size + 1;
}
void split(int p,int siz,int &x,int &y){
    if(!p)
    x=y=0;
    else{
        pushdown(p);
        if(tr[tr[p].l].size<siz){
            x=p;
            split(tr[p].r,siz-tr[tr[p].l].size-1,tr[p].r,y);
        }
        else{
            y=p;
            split(tr[p].l,siz,x,tr[p].l);
        }
        pushup(p);
    }
}
//保证输入的值按序列号左大右小
int merge(int x,int y){
    if(!x||!y)
        return x+y;
    if(tr[x].rnd>tr[y].rnd){
        pushdown(x);
        tr[x].r=merge(tr[x].r,y);
        pushup(x);
        return x;
    }
    else{
        pushdown(y);
        tr[y].l=merge(x,tr[y].l);
        pushup(y);
        return y;
    }
}
int main(){
    cin>>n;
    tr[0].mi=2e9;
    int i;
    for(i=1;i<=n;i++){
        int x;
        scanf("%d",&x);
        root=merge(root,get(x));
    }
    string s;
    int m;
    cin>>m;
    while(m--){
        cin>>s;
        if(s=="ADD"){
            int l,r,d;
            scanf("%d%d%d",&l,&r,&d);
            split(root,l-1,x,y);split(y,r-l+1,y,z);
            tr[y].add+=d,tr[y].key+=d;
            y=merge(y,z);
            root=merge(x,y);
        }
        else if(s=="REVERSE"){
            int l,r;
            scanf("%d%d",&l,&r);
            split(root,l-1,x,y);split(y,r-l+1,y,z);
            tr[y].rev^=1;
            y=merge(y,z);
            root=merge(x,y);
        }
        else if(s=="REVOLVE"){
            int l,r,t,tmp1,tmp2,tmp3,tmp4;
            scanf("%d%d%d",&l,&r,&t);
            t%=(r-l+1);
            if(t){
                split(root,l-1,tmp1,tmp2);
                split(tmp2,r-l+1-t,tmp2,tmp3);
                split(tmp3,t,tmp3,tmp4);
                root=merge(merge(tmp1,tmp3),merge(tmp2,tmp4));
            }
        }
        else if(s[0]==I){
            int l,p;
            scanf("%d%d",&l,&p);
            split(root,l,x,y);
            root=merge(x,merge(get(p),y));
        }
        else if(s[0] == D) {
            int d;
            scanf("%d", &d);
            split(root, d - 1,x, y), split(y, 1, y, z);
            root = merge(x,z);
        }
        else if(s[0] == M) {
            int l,r;scanf("%d%d", &l, &r);
            split(root, l - 1, x, y), split(y, r - l + 1, y,z);
            printf("%d\n", tr[y].mi);
            root = merge(x, merge(y, z));
        }
    }
}
View Code

 

AcWing266 超级备忘录(fhq-treap)

标签:void   模板   lap   pac   swap   scan   sed   show   space   

原文地址:https://www.cnblogs.com/ctyakwf/p/12784298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!