社区讨论
WA ON SUB1 求调
P3224[HNOI2012] 永无乡参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @mhjs5a0h
- 此快照首次捕获于
- 2025/11/04 07:37 4 个月前
- 此快照最后确认于
- 2025/11/04 07:37 4 个月前
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=5e5+100;
//原本的大小是1e5,但是有插入,所以要加上m的大小
int n,m;
struct Splay{
struct NODE{
int s[2],p,v,id;
int size;
void init(int _v,int _id,int _p)
{
v=_v,id=_id,p=_p;
size=1;
}
}tr[N];
int root[N],idx;
void pushup(int x)
{
tr[x].size=tr[tr[x].s[0]].size+tr[tr[x].s[1]].size+1;
}
void rotate(int x)
{
int y=tr[x].p,z=tr[y].p;
int k=tr[y].s[1]==x;
tr[z].s[tr[z].s[1]==y]=x,tr[x].p=z;
tr[y].s[k]=tr[x].s[k^1],tr[tr[x].s[k^1]].p=y;
tr[x].s[k^1]=y,tr[y].p=x;
pushup(y),pushup(x);
}
void splay(int x,int k,int b)
{
while(tr[x].p!=k)
{
int y=tr[x].p,z=tr[y].p;
if(z!=k)
if((tr[y].s[1]==x)^(tr[z].s[1]==y)) rotate(x);
else rotate(y);
rotate(x);
}
if(!k) root[b]=x;
}
void insert(int v,int id,int b)
{
int u=root[b],p=0;
while(u) p=u,u=tr[u].s[v>tr[u].v];
u=++idx;
if(p) tr[p].s[v>tr[p].v]=u;
tr[u].init(v,id,p);
splay(u,0,b);
}
int get_k(int k,int b)
{
int u=root[b];
while(u)
{
if(tr[tr[u].s[0]].size>=k) u=tr[u].s[0];
else if(tr[tr[u].s[0]].size+1==k)
return splay(u,0,b),tr[u].id;
else k-=tr[tr[u].s[0]].size+1,u=tr[u].s[1];
}
return -1;
}
void merge(int u,int b)
{
if(tr[u].s[0]) merge(tr[u].s[0],b);
if(tr[u].s[1]) merge(tr[u].s[1],b);
insert(tr[u].v,tr[u].id,b);
}
}Tr;
int f[N];
int find(int x)
{
if(f[x]!=x) f[x]=find(f[x]);
return f[x];
}
signed main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
{
f[i]=Tr.root[i]=i;
int v;
cin>>v;
Tr.tr[i].init(v,i,0);
}
Tr.idx=n;
while(m--)
{
int a,b;
cin>>a>>b;
a=find(a),b=find(b);
if(a!=b)
{
if(Tr.tr[Tr.root[a]].size>Tr.tr[Tr.root[b]].size) swap(a,b);
Tr.merge(Tr.root[a],b);
f[a]=b;
}
}
cin>>m;
while(m--)
{
char op;
int a,b;
cin>>op>>a>>b;
if(op=='B')
{
a=find(a),b=find(b);
if(a!=b)
{
if(Tr.tr[Tr.root[a]].size>Tr.tr[Tr.root[b]].size) swap(a,b);
Tr.merge(Tr.root[a],b);
f[a]=b;
}
}
else
{
a=find(a);
if(Tr.tr[Tr.root[a]].size<b) cout<<-1<<endl;
else cout<<Tr.get_k(b,a)<<endl;
}
}
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...