求助

P4146 序列终结者

flowerletter @ 2018-12-25 12:09:59

#include <bits/stdc++.h>
using namespace std;
#define lson tree[x].son[0]
#define rson tree[x].son[1]
#define Int register int
const int MAXN = 50010;
const int inf = 1<<30;
int n,q,root,tot;
struct fhq_Treap{
    int rnd,Max,sum,delta,lazy,size,son[2];
}tree[MAXN];
inline int read(){
    int x=0,f=1;char c=getchar();
    while(c<'0' || c>'9'){if(c=='-')f=-1;c=getchar();}
    while(c>='0' && c<='9'){x=x*10+c-'0';c=getchar();}
    return x*f;
} 
inline void Add_One(int x,int delta){tree[x].sum+=delta; tree[x].delta+=delta; tree[x].Max+=delta;}
inline void Reverse_One(int x){tree[x].lazy^=1;swap(lson,rson);}
inline void Up(int x){
    if(!x) return ;
    tree[x].Max=max(tree[x].sum,max(tree[lson].Max,tree[rson].Max)),
    tree[x].size=tree[lson].size+tree[rson].size+1;
}
inline void Down(int x){
    if(!x) return ;
    if(tree[x].delta) Add_One(lson,tree[x].delta),Add_One(rson,tree[x].delta);
    if(tree[x].lazy) Reverse_One(lson),Reverse_One(rson);
    tree[x].delta=tree[x].lazy=0;
}
inline void Merge(int &x,int l,int r){
    if(!l || !r) x=l+r;
    else if(tree[l].rnd<tree[r].rnd) Down(x=l),Merge(rson,rson,r),Up(x);
    else Down(x=r),Merge(lson,l,lson),Up(x);
}
inline void Split(int x,int &l,int &r,int k){
    if(!k) l=0,r=x;
    else if(k==tree[x].size) l=x,r=0;
    else if(k<=tree[lson].size) Down(r=x),Split(lson,l,lson,k),Up(x);
    else Down(l=x),Split(rson,rson,r,k-tree[lson].size-1),Up(x);
}
inline void Add(int l,int r,int delta){
    int x,y,z;
    Split(root,x,y,r),Split(x,z,x,l-1);
    Add_One(x,delta);
    Merge(x,z,x),Merge(root,x,y);
}
inline void Reverse(int l,int r){
    int x,y,z;
    Split(root,x,y,r),Split(x,z,x,l-1);
    Reverse_One(x);
    Merge(x,z,x),Merge(root,x,y);
}
inline int Query(int l,int r){
    int x,y,z,ans;
    Split(root,x,y,r),Split(x,z,x,l-1);
    ans=tree[x].Max;
    Merge(x,z,x),Merge(root,x,y);
    return ans;
}
int main(){
    srand(1021+1314);
    n=read(),q=read();tree[0].rnd=inf,tree[0].sum=tree[0].Max=-inf;
    for(int i=1;i<=n;i++) tree[++tot].size=1,tree[tot].rnd=rand()<<15|rand(),Merge(root,root,tot);
    for(int i=1;i<=q;i++){
        int op=read();
        if(op==1) Add(read(),read(),read());
        else if(op==2) Reverse(read(),read());
        else printf("%d\n",Query(read(),read()));
    }
    return 0;
}

by flowerletter @ 2018-12-25 12:31:48

找到错了,此贴已沉,完美撒花


by flowerletter @ 2020-11-19 19:13:35

撒花!


by flowerletter @ 2020-11-19 19:13:47

花花!


|