社区讨论
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 条回复,欢迎继续交流。
正在加载回复...