2 条题解
-
0
#include <bits/stdc++.h> using namespace std; const int N=1e5+5; int to[N<<1],nxt[N<<1],head[N],fa[N],boss[N],built[N],ans[N],idx[N],opt[N],tot; void add(int u,int v) { to[++tot]=v,nxt[tot]=head[u],head[u]=tot; } void dfs(int x) { for(int i=head[x];i;i=nxt[i]) if(to[i]!=fa[x]) fa[to[i]]=x,dfs(to[i]); } int find(int x) { return (boss[x]==x)?x:(boss[x]=find(boss[x])); } int main() { int n,m; scanf("%d%d",&n,&m); int u,v; for(int i=1;i<n;i++) scanf("%d%d",&u,&v),add(u,v),add(v,u); dfs(1); built[1]=1;//重建次数 for(int i=1;i<=m;i++) { scanf("%d%d",&opt[i],&idx[i]); if(opt[i]==0) built[idx[i]]++; } for(int i=1;i<=n;i++) boss[i]=(built[i])?i:fa[i];//并查集初始化:重建过,指向自己;没重建过,指向父亲 for(int i=m;i>=1;i--) // 倒序 { if(opt[i]==0) { built[idx[i]]--;//重建次数减一,删除一次标记 if(!built[idx[i]]) boss[idx[i]]=fa[idx[i]];// 没重建过,指向自己的父亲 } else ans[i]=find(idx[i]); } for(int i=1;i<=m;i++) if(opt[i]==1) printf("%d\n",ans[i]); return 0; }
- 1
信息
- ID
- 393
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- (无)
- 递交数
- 38
- 已通过
- 16
- 上传者