splay TLE on #12 求条
查看原帖
splay TLE on #12 求条
1451441
Mii2308楼主2025/7/30 14:21
#include<iostream>
#include<algorithm>
#define N 1100006
#define inf 0x7fffffff
using namespace std;
struct SplayTree{
    int s[2],fa;
    int value,cnt,sz;
    void init(int p,int v){fa=p;value=v;cnt=sz=1;}
}tr[N];
int root,tot;
inline void pushup(int p){
    int ls=tr[p].s[0],rs=tr[p].s[1];
    tr[p].sz=tr[ls].sz+tr[rs].sz+tr[p].cnt;
}
inline void rotate(int x){
    int y=tr[x].fa,z=tr[y].fa;
    bool ys=(tr[y].s[1]==x),zs=(tr[z].s[1]==y);
    int &subx=tr[x].s[ys^1];
    tr[z].s[zs]=x;tr[x].fa=z;
    tr[y].s[ys]=subx;if(subx)tr[subx].fa=y;
    subx=y;tr[y].fa=x;
    pushup(y),pushup(x);
}
inline void splay(int x,int k){
    while(tr[x].fa!=k){
        int y=tr[x].fa,z=tr[y].fa;
        bool ys=(tr[y].s[1]==x),zs=(tr[z].s[1]==y);
        if(z!=k) (ys^zs)?rotate(x):rotate(y);
        rotate(x);
    }
    if(!k) root=x;
}
inline void ins(int v){
    int x=root,fa=0;
    while(x&&tr[x].value!=v){
        fa=x;x=tr[x].s[v>tr[x].value];
    }
    if(x) tr[x].cnt++;
    else {
        tot++;x=tot;
        if(fa) tr[fa].s[v>tr[fa].value]=x;
        tr[x].init(fa,v);
    }
    splay(x,0);
}
inline void del(int v){
    int x=root;
    while(x&&tr[x].value!=v){
        x=tr[x].s[v>tr[x].value];
    }
    if(!x) return;
    splay(x,0);
    if(tr[x].cnt>1){
        tr[x].cnt--;
        pushup(x);
        return;
    }
    int left=tr[x].s[0],right=tr[x].s[1];
    if(left) tr[left].fa=0;
    if(right) tr[right].fa=0;
    if(!left && !right) root=0;
    else if(!left) root=right;
    else if(!right) root=left;
    else {
        int y=left;
        while(tr[y].s[1]) y=tr[y].s[1];
        splay(y,0);
        tr[y].s[1]=right;
        tr[right].fa=y;
        pushup(y);
        root=y;
    }
}
inline int getrank(int v){
    int x=root,res=0;
    while(x){
        if(tr[x].value<v){
            res+=tr[tr[x].s[0]].sz+tr[x].cnt;
            x=tr[x].s[1];
        }else x=tr[x].s[0];
    }
    return res;
}
inline int getkthvalue(int k){
    int x=root;
    while(x){
        int y=tr[x].s[0];
        if(tr[y].sz+tr[x].cnt<k){
            k-=tr[y].sz+tr[x].cnt;
            x=tr[x].s[1];
        }else if(tr[y].sz>=k) x=tr[x].s[0];
        else break;
    }
    if(x) splay(x,0);
    return tr[x].value;
}
inline int getpre(int v){
    int x=root,pre=-1;
    while(x){
        if(tr[x].value<v){
            pre=x;
            x=tr[x].s[1];
        }else x=tr[x].s[0];
    }
    if(pre!=-1) splay(pre,0);
    return tr[pre].value;
}
inline int getsuc(int v){
    int x=root,suc=-1;
    while(x){
        if(tr[x].value>v){
            suc=x;
            x=tr[x].s[0];
        }else x=tr[x].s[1];
    }
    if(suc!=-1) splay(suc,0);
    return tr[suc].value;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);std::cout.tie(0);
    int n,m;cin>>n>>m;
    ins(-inf);ins(inf);
    for(int i=1;i<=n;i++){
        int t;cin>>t;ins(t);
    } 
    int last=0,ans=0;
    for(int i=1;i<=m;i++){
        int op,x;cin>>op>>x;
        x^=last;
        switch(op){
            case 1:{ins(x);break;}
            case 2:{del(x);break;}
            case 3:{
                last=getrank(x);ans^=last;
                break;
            }
            case 4:{
                last=getkthvalue(x+1);ans^=last;
                break;
            }
            case 5:{
                last=getpre(x);ans^=last;
                break;
            }
            case 6:{
                last=getsuc(x);ans^=last;
                break;
            }
        } 
    }
    cout<<ans<<"\n";
    return 0;
}
2025/7/30 14:21
加载中...