MLE求助

P6136 【模板】普通平衡树(数据加强版)

ryt47479 @ 2025-01-12 20:24:35

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int T=2e6+10;
int rt,cnt,seed=1;
struct node{
    int ls,rs;
    int key,val,siz;
}c[T];
struct r_pair{
    int a,b; 
    r_pair(int a_=0,int b_=0){a=a_;b=b_;}
};
int pushup(int p){c[p].siz=c[c[p].ls].siz+c[c[p].rs].siz+1;}
int rnd(){return seed*=19932792323;}
int newnode(int k){
    ++cnt;
    c[cnt].key=k,c[cnt].val=rnd();
    c[cnt].siz=1;
    return cnt;
}
r_pair split(int p,int k){
    if(!p)return  r_pair(0,0);
    if(c[p].key<k){
        r_pair x=split(c[p].rs,k);
        c[p].rs=x.a;
        pushup(p);
        return r_pair(p,x.b);
    }
    else{
        r_pair x=split(c[p].ls,k);
        c[p].ls=x.b;
        pushup(p);
        return r_pair(x.a,p);
    }
}
int merge(int u,int v){
    if(!u||!v)return u+v;
    if(c[u].val<c[v].val){
        c[u].rs=merge(c[u].rs,v);
        pushup(u);
        return u;
    }
    else{
        c[v].ls=merge(u,c[v].ls);
        pushup(v);
        return v;
    }
}
void insert(int k){
    int p=newnode(k);
    r_pair y=split(rt,k);
    rt=merge(y.a,merge(p,y.b));
}
void del(int k){
    r_pair y=split(rt,k);
    r_pair z=split(y.b,k+1);
    z.a=merge(c[z.a].ls,c[z.a].rs);
    rt=merge(y.b,merge(z.a,z.b));
}
int find(int k){
    r_pair y=split(rt,k);
    int ans=c[y.a].siz+1;
    rt=merge(y.a,y.b);
    return ans;
}
int kth(int x){
    int p=rt;
    while(p){
        if(c[c[p].ls].siz+1==x)return c[p].key;
        if(c[c[p].ls].siz>=x)p=c[p].ls;
        else x-=c[c[p].ls].siz+1,p=c[p].rs;
    }
}
int lst(int x){return kth(find(x)-1);}
int nxt(int x){return kth(find(x+1));}
int n,m;
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>m;
    while(n--){
        int x;cin>>x;
        insert(x);
    }
    int ans=0;
    int k=0;
    while(m--){
        int op,x;cin>>op>>x;
        x^=ans;
        if(op==1){insert(x);}
        if(op==2){del(x);}
        if(op==3){ans=find(x);k^=ans;}
        if(op==4){ans=kth(x);k^=ans;}
        if(op==5){ans=lst(x);k^=ans;}
        if(op==6){ans=nxt(x);k^=ans;}
    }
    cout<<k;
    return 0;
}

全MLE了,求救


by ryt47479 @ 2025-01-12 20:34:47

已解决,此贴结


|