1 条题解
-
0
自动搬运
来自洛谷,原作者为

Yashajin_Ai
夜叉神天衣--Yashajin_Ai搬运于
2025-08-24 22:41:40,当前版本为作者最后更新于2023-02-23 15:10:22,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
发现一个性质:最多只会合并 次(类似树只有 条边)。
于是在合并的时候暴力统计即可。
时间复杂度 。
建议使用路径压缩和启发式合并。
# include <bits/stdc++.h> using namespace std; const int N=10000; int f[N+10],siz[N+10]; int find(int x){ if(f[x]==x){ return x; } return f[x]=find(f[x]); } int val [N + 10], ans [N + 10]; int main () { int n,m; cin>>n>>m; for(int i=1;i<=n;++i){ f[i]=i; siz[i]=1; } while(m--){ int op,x,y; cin>>op>>x>>y; switch(op){ case 1:{ x=find(x); y=find(y); if(x!=y){ for(int i=1;i<=n;++i){ ans[i]+=val[find(i)]; } for(int i=1;i<=n;++i){ val[i]=0; } if(siz[x]>siz[y]) { swap(x,y); } f[x]=y; siz[y]+=siz[x]; } break; } case 2:{ x=find(x); val[x]+=y; break; } } } for(int i=1;i<=n;++i) { cout<<ans[i]+val[find(i)]<<" "; } return 0; }
- 1
信息
- ID
- 8084
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者