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