社区讨论
我是霉国仁help meMLE on#9、#10 && WA on#13
P3402【模板】可持久化并查集参与者 9已保存回复 9
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 9 条
- 当前快照
- 1 份
- 快照标识符
- @lol36o34
- 此快照首次捕获于
- 2023/11/05 14:22 2 年前
- 此快照最后确认于
- 2023/11/25 12:24 2 年前
CPP
#include<bits/stdc++.h>
#define mid (lt+rt>>1)
#define fa(x,y) query_fa(root[x],1,n,y)
#define dep(x,y) query_dep(root[x],1,n,y)
using namespace std;
const int cxk=1e6+5;
int n,m,tot,root[cxk];
struct ikun
{
int lt,rt,dep,fa;
}tree[cxk*54];
int build(int lt,int rt)
{
int cur=++tot;
if(lt==rt)
{
tree[cur].dep=1;
tree[cur].fa=lt;//fa[i]=i;
return cur;
}
tree[cur].lt=build(lt,mid);
tree[cur].rt=build(mid+1,rt);
return cur;
}
int update_fa(int cur,int lt,int rt,int q,int val)
{
int nxt_cur=++tot;
tree[nxt_cur]=tree[cur];
if(lt==rt)
{
tree[nxt_cur].fa=val;
return nxt_cur;
}
if(q<=mid)
tree[nxt_cur].lt=update_fa(tree[cur].lt,lt,mid,q,val);
else
tree[nxt_cur].rt=update_fa(tree[cur].rt,mid+1,rt,q,val);
return nxt_cur;
}
int update_dep(int cur,int lt,int rt,int q,int val)
{
int nxt_cur=++tot;
tree[nxt_cur]=tree[cur];
if(lt==rt)
{
tree[nxt_cur].dep=val;
return nxt_cur;
}
if(q<=mid)
tree[nxt_cur].lt=update_dep(tree[cur].lt,lt,mid,q,val);
else
tree[nxt_cur].rt=update_dep(tree[cur].rt,mid+1,rt,q,val);
return nxt_cur;
}
int query_fa(int cur,int lt,int rt,int q)
{
if(lt==rt)
return tree[cur].fa;
if(q<=mid)
return query_fa(tree[cur].lt,lt,mid,q);
return query_fa(tree[cur].rt,mid+1,rt,q);
}
int query_dep(int cur,int lt,int rt,int q)
{
if(lt==rt)
return tree[cur].dep;
if(q<=mid)
return query_dep(tree[cur].lt,lt,mid,q);
return query_dep(tree[cur].rt,mid+1,rt,q);
}
int find(int v,int x)
{
//cout<<x<<" ";
return fa(v,x)==x?x:find(v,fa(v,x));
}
void unio(int cur,int v,int x,int y)
{
x=fa(v,x),y=fa(v,y);
if(dep(v,x)<dep(v,y))
swap(x,y);
root[cur]=update_fa(root[v],1,n,y,x);//fa[y]=x;
if(dep(cur,x)==dep(cur,y))
root[cur]=update_dep(root[cur],1,n,x,dep(cur,x)+1);//dep[x]=max(dep[x],dep[y]+1);
}
signed main()
{
ios::sync_with_stdio(0),cin.tie(0);
cin>>n>>m;
root[0]=build(1,n);
for(int i=1,vrs=0,opt,x,y;i<=m;i++)
{
cin>>opt>>x;
if(opt==1)
{
cin>>y;
unio(i,i-1,x,y);
}
if(opt==2)
root[i]=root[x];
if(opt==3)
{
cin>>y;
root[i]=root[i-1];
cout<<(find(i,x)==find(i,y))<<"\n";
}
}
return 0;
}
回复
共 9 条回复,欢迎继续交流。
正在加载回复...