求助Treap

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

JS_TZ_ZHR @ 2020-04-16 21:28:16

RT,本机和洛谷都WA了,求差错。

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int n,m,total,root,x,a,lastans,ans;
struct Treap {
    int son[2];
    int val;
    int size,cnt;
    int dat;
} t[2000005];
inline int newnode(int val) {
    t[++total].val=val;
    t[total].dat=rand();
    t[total].size=t[total].cnt=1;
    return total;
}
inline void push_up(int p) {
    t[p].size=t[t[p].son[0]].size+t[t[p].son[1]].size+t[p].cnt;
}
inline void spin(int &p,bool opt) {
    int temp=t[p].son[opt^1];
    t[p].son[opt^1]=t[temp].son[opt];
    t[temp].son[opt]=p;
    p=temp;
    push_up(t[p].son[opt]);
    push_up(p);
}
void insert(int &p,int val) {
    if(!p) {
        p=newnode(val);
        return;
    }
    if(val==t[p].val)
        t[p].cnt++;
    else {
        if(val<t[p].val) {
            insert(t[p].son[0],val);
            if(t[p].dat<t[t[p].son[0]].dat)spin(p,1);
        } else {
            insert(t[p].son[1],val);
            if(t[p].dat<t[t[p].son[1]].dat)spin(p,0);
        }
    }
    push_up(p);
}
void _delete(int &p,int val) {
    if(!p)return;
    if(val==t[p].val) {
        if(t[p].cnt>1)t[p].cnt--,push_up(p);
        else {
            if(t[p].son[0]||t[p].son[1]) {
                if(!t[p].son[1]||t[t[p].son[0]].dat>t[t[p].son[1]].dat)
                    spin(p,1),_delete(t[p].son[1],val);
                else spin(p,0),_delete(t[p].son[0],val);
                push_up(p);
            } else p=0;
        }
    }
    if(val<t[p].val)_delete(t[p].son[0],val);
    else _delete(t[p].son[1],val);
    push_up(p);
}
int rank(int p,int val) {
    if(!p)return 0;
    if(val==t[p].val)return t[t[p].son[0]].size+1;
    if(val<t[p].val)return rank(t[p].son[0],val);
    else return rank(t[p].son[1],val)+t[t[p].son[0]].size+t[p].cnt;
}
int val(int p,int rank) {
    if(!p)return 0;
    if(rank<=t[t[p].son[0]].size)return val(t[p].son[0],rank);
    else if(rank<=t[t[p].son[0]].size+t[p].cnt)return t[p].val;
    else return val(t[p].son[1],rank-(t[t[p].son[0]].size+t[p].cnt));
}
int pre(int val) {
    int p=root,res;
    while(p) {
        if(t[p].val<val) {
            res=t[p].val;
            p=t[p].son[1];
        } else p=t[p].son[0];
    }
    return res;
}
int next(int val) {
    int p=root,res;
    while(p) {
        if(t[p].val>val) {
            res=t[p].val;
            p=t[p].son[0];
        } else p=t[p].son[1];
    }
    return res;
}
signed main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1; i<=n; i++) {
        scanf("%lld",&a);
        insert(root,a);
    }
    while(m--) {
        scanf("%lld%lld",&x,&a);
        a^=lastans; 
        //printf("%lld %lld %lld\n",x,a,lastans);
        if(x==1)insert(root,a);
        if(x==2)_delete(root,a);
        if(x==3) {
            lastans=rank(root,a)+1;
            ans^=lastans;
        }
        if(x==4) {
            lastans=val(root,a);
            ans^=lastans;
        }
        if(x==5) {
            lastans=pre(a);
            ans^=lastans;
        }
        if(x==6) {
            lastans=next(a);
            ans^=lastans;
        }
    }
    printf("%lld\n",ans);
}

by liqingyang @ 2020-04-16 22:04:51

@愚かなる弟よ emmmm,建议您写一个printf函数


by liqingyang @ 2020-04-16 22:05:09

@愚かなる弟よ 或者自己写一个暴力或粘贴题解对拍


by lytqwq @ 2020-04-24 21:38:16

@愚かなる弟よ rank函数return 1;


|