社区讨论

AVL80pts求助!玄关!

P6136【模板】普通平衡树(数据加强版)参与者 4已保存回复 4

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
4 条
当前快照
1 份
快照标识符
@mhjh68qq
此快照首次捕获于
2025/11/04 02:30
4 个月前
此快照最后确认于
2025/11/04 02:30
4 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int n,m,cnt,op,tmp,rt,last,ans;
struct str{
    int l,r,v,sz,c,yz,h;
}t[7000005];
inline int faster_read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-') f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
    {
        x=x*10+(ch-48);
        ch=getchar();
    }
    return x*f;
}
inline void faster_write(int x)
{
    if(x<0)
    {
        putchar('-');
        x=-x;
    }
    if(x>9) faster_write(x/10);
    putchar(x%10+48);
}
void update(int x)
{
    t[x].h=max(t[t[x].l].h,t[t[x].r].h)+1;
    t[x].sz=t[t[x].l].sz+t[t[x].r].sz+t[x].c;
    t[x].yz=t[t[x].l].h-t[t[x].r].h;
    return ;
}
void lot(int &x)
{
    int y=t[x].r;
    t[x].r=t[y].l;
    t[y].l=x;
    update(x);
    update(y);
    x=y;
    return ;
}
void rot(int &x)
{
    int y=t[x].l;
    t[x].l=t[y].r;
    t[y].r=x;
    update(x);
    update(y);
    x=y;
    return ;
}
void add(int &x,int val)
{
    if(val==t[x].v)
    {
        t[x].c++;
        t[x].sz++;
        update(x);
        return ;
    }
    if(x==0)
    {
        x=++cnt;
        t[x].sz=t[x].h=t[x].c=1;
        t[x].yz=0;
        t[x].v=val;
        return ;
    }
    if(val<t[x].v) add(t[x].l,val);
    else add(t[x].r,val);
    update(x);
    if(t[x].yz==2)
    {
        if(t[t[x].l].yz==1) rot(x);
        else lot(t[x].l),rot(x);
    }
    if(t[x].yz==-2)
    {
        if(t[t[x].r].yz==-1) lot(x);
        else rot(t[x].r),lot(x);
    }
    return ;
}
void del(int &x,int val)
{
    if(val==t[x].v)
    {
        t[x].c--;
        t[x].c=max(t[x].c,0);
        update(x);
        return ;
    }
    if(val<t[x].v) del(t[x].l,val);
    else del(t[x].r,val);
    update(x);
    return ;
}
int ranks(int x,int val)
{
    if(x==0) return 0;
    if(val<t[x].v) return ranks(t[x].l,val);
    else if(val>t[x].v) return ranks(t[x].r,val)+t[t[x].l].sz+t[x].c;
    return t[t[x].l].sz;
}
int find(int x,int val)
{
    if(val<=t[t[x].l].sz) return find(t[x].l,val);
    else if(val>t[t[x].l].sz+t[x].c) return find(t[x].r,val-t[t[x].l].sz-t[x].c);
    return t[x].v;
}
int qian(int x,int val)
{
    if(x==0) return 0x7fffffff;
    if(val<=t[x].v) return qian(t[x].l,val);
    int sum=qian(t[x].r,val);
    if(sum==0x7fffffff) return (t[x].c>0?t[x].v:qian(t[x].l,val));
    return sum;
}
int hou(int x,int val)
{
    if(x==0) return 0x7fffffff;
    if(val>=t[x].v) return hou(t[x].r,val);
    int sum=hou(t[x].l,val);
    if(sum==0x7fffffff) return (t[x].c>0?t[x].v:hou(t[x].r,val));
    return sum;
}
int main()
{
    n=faster_read();
    m=faster_read();
    for(int i=1;i<=n;i++)
    {
        tmp=faster_read();
        add(rt,tmp);
    }
    for(int i=1;i<=m;i++)
    {
        op=faster_read();
        tmp=faster_read();
        tmp=(tmp^last);
        if(op==1) add(rt,tmp);
        else if(op==2) del(rt,tmp);
        else if(op==3) ans=(ans==0)?(ranks(rt,tmp)+1):(ans^(ranks(rt,tmp)+1)),last=ranks(rt,tmp)+1;
        else if(op==4) ans=(ans==0)?(find(rt,tmp)):(ans^find(rt,tmp)),last=find(rt,tmp);
        else if(op==5) ans=(ans==0)?(qian(rt,tmp)):(ans^qian(rt,tmp)),last=qian(rt,tmp);
        else if(op==6) ans=(ans==0)?(hou(rt,tmp)):(ans^hou(rt,tmp)),last=hou(rt,tmp);
    }
    faster_write(ans);
    return 0;
}

回复

4 条回复,欢迎继续交流。

正在加载回复...