萌新求助模板Treap,80pts

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

dxy2020 @ 2022-10-13 22:52:31

rt,P3369过了

#include <bits/stdc++.h>
using namespace std;
const int INF=2147483647;
const int M=1100005;
inline void in (int &x){
    x=0;int f=1;char c=getchar();
    while (c<'0'||c>'9'){if (c=='-') f=-1;c=getchar();}
    while (c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    x*=f;
}
inline void out (int x){
    char F[20];int tmp=x>0?x:-x,cnt=0;
    if (x<0) putchar('-');
    while (tmp){F[cnt++]=tmp%10+'0';tmp/=10;}
    while (cnt) putchar(F[--cnt]);puts ("");
}
int idx,root,n,m,op,x,last,ans;
struct Treap{
    int l,r;
    int val,dat;
    int siz,cnt;
}T[M];
inline int New (int v){
    T[++idx].val=v;
    T[idx].cnt=T[idx].siz=1;
    T[idx].dat=rand ();
    return idx;
}
inline void Update (int u){
    T[u].siz=T[T[u].l].siz+T[T[u].r].siz+T[u].cnt;
}
inline void Build (){
    New (-INF);New (INF);
    root=1;T[1].r=2;Update (root);
}
inline void zig (int &u){
    int p=T[u].l;T[u].l=T[p].r;T[p].r=u;u=p;
    Update (T[u].r);Update (u);
}
inline void zag (int &u){
    int p=T[u].r;T[u].r=T[p].l;T[p].l=u;u=p;
    Update (T[u].l);Update (u);
}
inline int GetRankByVal (int u,int v){
    if (!u) return 0;
    if (v==T[u].val) return T[T[u].l].siz+1;
    if (v>T[u].val) return GetRankByVal (T[u].r,v)+T[T[u].l].siz+T[u].cnt;
    return GetRankByVal (T[u].l,v);
}
inline int GetValByRank (int u,int k){
    if (!u) return INF;
    if (T[T[u].l].siz>=k) return GetValByRank (T[u].l,k);
    if (T[T[u].l].siz+T[u].cnt>=k) return T[u].val;
    return GetValByRank (T[u].r,k-T[T[u].l].siz-T[u].cnt);
}
inline void Insert (int &u,int v){
    if (!u){u=New (v);return ;}
    if (T[u].val==v){++T[u].cnt;Update (u);return ;}
    if (T[u].val>v){Insert (T[u].l,v);if (T[u].dat<T[T[u].l].dat) zig (u);}
    else{Insert (T[u].r,v);if (T[u].dat<T[T[u].r].dat) zag (u);}
    Update (u);
}
inline void Remove (int &u,int v){
    if (!u) return ;
    if (T[u].val==v){
        if (T[u].cnt>1){--T[u].cnt;Update (u);return ;}
        if (T[u].l||T[u].r){
            if (!T[u].r||T[T[u].r].dat<T[T[u].l].dat){zig (u);Remove (T[u].r,v);}
            else{zag (u);Remove (T[u].l,v);}
            Update (u);
        }
        else u=0;return ;
    }
    v<T[u].val?Remove (T[u].l,v):Remove (T[u].r,v);
    Update (u);
}
inline int GetPrev (int v){
    int ans=1,u=root;
    while (u){
        if (T[u].val==v){
            if (T[u].l){u=T[u].l;while (T[u].r) u=T[u].r;ans=u;}
            break;
        }
        if (T[u].val<v&&T[u].val>T[ans].val) ans=u;
        u=v<T[u].val?T[u].l:T[u].r;
    }
    return T[ans].val;
}
inline int GetNext (int v){
    int ans=2,u=root;
    while (u){
        if (T[u].val==v){
            if (T[u].r){u=T[u].r;while (T[u].l) u=T[u].l;ans=u;}
            break;
        }
        if (T[u].val>v&&T[u].val<T[ans].val) ans=u;
        u=v<T[u].val?T[u].l:T[u].r;
    }
    return T[ans].val;
}
signed main (){
    Build ();
    in (n);in (m);
    for (int i=1;i<=n;++i){
        in (x);Insert (root,x);
    }
    while (m--){
        in (op);in (x);x^=last;
        if (op==1) Insert (root,x);
        if (op==2) Remove (root,x);
        if (op==3){Insert (root,x);last=GetRankByVal (root,x)-1;Remove (root,x);ans^=last;}
        if (op==4){last=GetValByRank (root,x+1);ans^=last;}
        if (op==5){last=GetPrev (x);ans^=last;}
        if (op==6){last=GetNext (x);ans^=last;}
    }
    out (ans);
    return 0;
}

by dxy2020 @ 2022-10-13 23:02:39

查出来了,out炸了。。


by 梦回江南 @ 2022-10-13 23:32:51

@dxy2020 建议直接平板电视


by dxy2020 @ 2022-10-14 18:25:43

@梦回江南 什么意思,能解释一下吗


by 梦回江南 @ 2022-10-14 19:13:08

link


|