MLE 0pts 求条
查看原帖
MLE 0pts 求条
1164692
lijianACE楼主2025/1/4 19:13

经典FHQ,但全MLE。

#include<bits/stdc++.h>
using namespace std;
#define ll long long 
const int N=2e5+10;
int cnt=0,root[N],n,lastans=0;
struct node{
    int ls,rs,pri,size,tag;
    ll key,sum;
};
node t[N<<7];
int newnode(int x){
    t[++cnt].size=1;
    t[cnt].ls=0;
    t[cnt].rs=0;
    t[cnt].pri=rand();
    t[cnt].key=x;
    t[cnt].tag=0;
    t[cnt].sum=x;
    return cnt;
}
int treecopy(int p){
    int rp=newnode(0);
    t[rp]=t[p];
    return rp;
}
void update(int p){
    t[p].size=t[t[p].ls].size+t[t[p].rs].size+1;
    t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum+t[p].key;
}
void pushdown(int p){
    if(t[p].tag){
        if(t[p].ls) t[p].ls=treecopy(t[p].ls);
        if(t[p].rs) t[p].rs=treecopy(t[p].rs);
        swap(t[p].ls,t[p].rs);
        t[t[p].ls].tag^=1;
        t[t[p].rs].tag^=1;
        t[p].tag=0;
    }
}
void split(int p,int x,int &L,int &R){
    if(!p){
        L=0;
        R=0;
        return;
    }
    pushdown(p);
    if(t[t[p].ls].size+1<=x){
        L=treecopy(p);
        split(t[L].rs,x-t[t[p].ls].size-1,t[L].rs,R);
        update(L);
    }
    else{
        R=treecopy(p);
        split(t[R].ls,x,L,t[R].ls);
        update(R);
    }
}
int Merge(int L,int R){
    if( !L || !R ) return L+R;
    pushdown(L);
    pushdown(R);
    if(t[L].pri>t[R].pri){    
        t[L].rs=Merge(t[L].rs,R);
        update(L);
        return L;
    }
    else{
        t[R].ls=Merge(L,t[R].ls);
        update(R);
        return R;
    }
}
int main(){
    srand(time(NULL));
    int L,R,p,v,op,vers=0;
    ll x,y;
    scanf("%d",&n);
    while(n--){
        scanf("%d%d",&v,&op);
        if(op==1){
            scanf("%lld%lld",&x,&y);
            x^=lastans;
            y^=lastans;
            split(root[v],x,L,p);
            root[++vers]=Merge(Merge(L,newnode(y)),p);
        }
        if(op==2){
            scanf("%lld",&x);
            x^=lastans;
            split(root[v],x,L,R);
            split(L,x-1,L,p);
            root[++vers]=Merge(L,R);
        }
        if(op==3){
            scanf("%lld%lld",&x,&y);
            x^=lastans;
            y^=lastans;
            split(root[v],y,L,R);
            split(L,x-1,L,R);
            t[p].tag^=1;
            root[++vers]=Merge(Merge(L,p),R);
        }
        if(op==4){
           scanf("%lld%lld",&x,&y);
            x^=lastans;
            y^=lastans;
            split(root[v],y,L,R);
            split(L,x-1,L,R);
            printf("%lld\n",t[p].sum);
            lastans=t[p].sum;
            root[++vers]=Merge(Merge(L,p),R);
        }
    }
    return 0;
}
2025/1/4 19:13
加载中...