社区讨论

fhq只对了#1 求助

P3369【模板】普通平衡树参与者 3已保存回复 4

讨论操作

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

当前回复
4 条
当前快照
1 份
快照标识符
@lo8e4xyo
此快照首次捕获于
2023/10/27 17:08
2 年前
此快照最后确认于
2023/10/27 17:08
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ls(x) fhq[x].l
#define rs(x) fhq[x].r
#define size(x) fhq[x].size
#define val(x) fhq[x].val
#define key(x) fhq[x].key
using namespace std;
int const maxn=1e5+5;
inline int read()
{
    int x=0,y=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-')y=1;c=getchar();}
    while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}
    return !y?x:-x;
}
inline void write(int x)
{
    if(x<0)x=~x+1;
    if(x>9)
        write(x/10);
    putchar(x%10+48);
}
struct node{
    int l,r,val,key,size;
}fhq[maxn];
int cnt,rt;
int x,y,z;
mt19937 rnd(28);
inline int newnode(int val)
{
    val(++cnt)=val;
    key(cnt)=rnd();
    size(cnt)=1;
    return cnt;
}
inline void update(int now)
{
    size(now)=size(ls(now))+size(rs(now))+1;
}
inline void split(int now,int val,int &x,int &y)
{
    if(!now)
        x=y=0;
    else
    {
        if(val(now)<=val)
        {
            x=now;
            split(rs(now),val,rs(now),y);
        }
        else
        {
            y=now;
            split(ls(now),val,x,ls(now));
        }
        update(now);
    }
}
inline int merge(int x,int y)
{
    if(!x||!y)
        return x+y;
    if(key(x)>key(y))
    {
        rs(x)=merge(rs(x),y);
        update(x);
        return x;
    }
    else
    {
        ls(y)=merge(x,ls(y));
        update(y);
        return y;
    }
}
inline void ins(int val)
{
    split(rt,val,x,y);
    rt=merge(merge(x,newnode(val)),y);
}
inline void del(int val)
{
    split(rt,val,x,z);
    split(x,val-1,x,y);
    y=merge(ls(y),rs(y));
    rt=merge(merge(x,y),z);
}
inline int getrank(int val)
{
    split(rt,val-1,x,y);
    rt=merge(x,y);
    return size(x)+1;
}
inline int getnum(int rank)
{
    int now=rt;
    while(now)
    {
        if(size(ls(now))+1==rank)
            break;
        else if(size(ls(now))>=rank)
            now=ls(now);
        else
        {
            rank-=size(ls(now))+1;
            now=rs(now);
        }
    }
    return val(now);
}
inline void pre(int val)
{
    split(rt,val-1,x,y);
    int now=x;
    while(rs(now))
        now=rs(now);
    write(val(now));
    rt=merge(x,y);
}
inline void nxt(int val)
{
    split(rt,val,x,y);
    int now=y;
    while(ls(now))
        now=ls(now);
    write(val(now));
    rt=merge(x,y);
}
signed main()
{
    int n=read(),op,a;
    while(n--)
    {
        op=read(),a=read();
        if(op==1)
            ins(a);
        else if(op==2)
            del(a);
        else if(op==3)
        {
            write(getrank(a));
            putchar('\n');
        }
        else if(op==4)
        {
            write(getnum(a));
            putchar('\n');
        }
        else if(op==5)
        {
            pre(a);
            putchar('\n');
        }
        else
        {
            nxt(a);
            putchar('\n');
        }
    }
    exit(0);
}

回复

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

正在加载回复...