关于【平衡树】

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

小穹 @ 2020-02-27 17:30:59

为什么我这个splay 第一次交T1一个点,第二次T2个点,第三次T3个点???

// splay 
#include<cctype> 
#include<cstdio>
using namespace std;
const int maxn=1100040;
int ff[maxn],ch[maxn][2],val[maxn],size[maxn],cnt[maxn],rot,tot,n,last,ans,m;
inline int read()
{
    int sum = 0,flag = 1 ;
    char ch =  getchar() ;  
    while( !isdigit(ch) ) 
    {
        if( ch == '-' ) flag = -1 ;
        ch = getchar() ;
    }
    while( isdigit(ch) )
    sum = ( sum << 1 ) + ( sum << 3 ) +  ( ch ^ 48 ) , ch = getchar() ;
    return sum *  flag ;
}
inline void update(int x){
    size[x]=size[ch[x][0]]+size[ch[x][1]]+cnt[x];
}
inline void Rotate(int x){
    int y=ff[x],z=ff[y],k=(ch[y][1]==x);
    ch[z][ch[z][1]==y]=x;
    ff[x]=z;
    ch[y][k]=ch[x][k^1];
    ff[ch[x][k^1]]=y;
    ch[x][k^1]=y;
    ff[y]=x;
    update(y); update(x);
}
inline void splay(int x,int goal){
    while(ff[x]!=goal){
        int y=ff[x],z=ff[y];
        if(z!=goal) (ch[z][0]==y)^(ch[y][0]==x)?Rotate(x):Rotate(y);
        Rotate(x);  
    } if(!goal) rot=x;
}
inline void find(int x){
    int u=rot;
    while(ch[u][x>val[u]]!=0&&x!=val[u]) u=ch[u][x>val[u]];
    splay(u,0);
}
inline void insert(int x){
    int fa=0,u=rot;
    while(u!=0&&x!=val[u]){
        fa=u;
        u=ch[u][x>val[u]];
    }
    if(u!=0) cnt[u]++;
    else{
        u=++tot;
        ch[fa][x>val[fa]]=u;
        val[u]=x;
        ff[u]=fa;
        cnt[u]=1;
        size[u]=1;
    }
    splay(u,0);
}
inline int pre_nxt(int x,int d){
    find(x); int u=rot;
    if((val[u]>x&&d)||(val[u]<x&&!d)) return u;
    u=ch[rot][d];
    while(ch[u][d^1]!=0) u=ch[u][d^1];
    return u;
} 
inline void del(int x){
    int xp=pre_nxt(x,0),np=pre_nxt(x,1);
    splay(xp,0); splay(np,rot);
    int u=ch[np][0];
    if(cnt[u]>1) cnt[u]--,splay(u,0);
    else ch[np][0]=0;
}
inline int getrank(int x){ find(x); return size[ch[rot][0]]+1; }
inline int getval(int x){
    int u=rot;
    while(40){
        int l=ch[u][0];
        if(size[l]>=x) u=l;
        else if(size[l]+cnt[u]>=x) return val[u];
        else x-=size[l]+cnt[u],u=ch[u][1];
    }
}
int main()
{
    n=read();m=read();
    insert(1<<30),insert(-1<<30); 
    for(int i=1;i<=n;i++) insert(read());
    while(m--)
    {
        int a=read(),b=read()^last;
        switch(a)
        {
            case 1:insert(b);break;
            case 2:del(b);break;
            case 3:insert(b);last=getrank(b)-1;ans^=last;del(b);break;
            case 4:last=getval(b+1);ans^=last;break;
            case 5:last=val[pre_nxt(b,0)];ans^=last;break;
            case 6:last=val[pre_nxt(b,1)];ans^=last;break;
        }
    }
    printf("%d\n",ans);
    return 0;
}

by Resonaa @ 2020-02-27 17:31:56

@张智文 评测机波动。开启 O2 优化即可AC。


by 随情英 @ 2020-02-27 17:31:58

可能评测机不稳定


by LinkCutTree @ 2020-02-27 17:32:18

标题瞩目


by 小穹 @ 2020-02-27 17:32:35

@kevinhou 这题不是自动开O2吗


by fa_555 @ 2020-02-27 17:33:10

@kevinhou 这题默认开氧(


by 风浪之子Mht @ 2020-02-27 17:35:40

標題當(bushi


|