比赛 4043级NOIP2022欢乐赛8th 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 Dance Mooves 最终得分 100
用户昵称 op_组撒头屯 运行时间 0.815 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2022-11-21 20:06:37
显示代码纯文本
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N=100000+5;
  4. int n,k,r=0;
  5. int a[N],b[N],id[N],cnt=0;
  6. bool vis[N],has[N];
  7. int ans[N]={0};
  8. vector<int>v[N];
  9. void dfs(int pt){
  10. id[pt]=cnt;vis[pt]=1;
  11. for (int i=0;i<v[pt].size();i++){
  12. int x=v[pt][i];
  13. if (!has[x]){
  14. has[x]=1;ans[cnt]++;
  15. }
  16. if (!vis[b[pt]])dfs(b[pt]);
  17. }
  18. return ;
  19. }
  20. int main(){
  21. freopen ("dance.in","r",stdin);
  22. freopen ("dance.out","w",stdout);
  23. scanf("%d%d",&n,&k);
  24. for (int i=1;i<=n;i++){
  25. b[i]=a[i]=i;
  26. v[b[i]].push_back(i);
  27. }
  28. for (int i=1;i<=k;i++){
  29. int x,y;scanf("%d%d",&x,&y);
  30. v[b[x]].push_back(y);
  31. v[b[y]].push_back(x);
  32. swap(b[x],b[y]);
  33. }
  34. for (int i=1;i<=n;i++){
  35. if (!vis[i]){
  36. memset(has,0,sizeof(has));
  37. cnt++;
  38. dfs(i);
  39. }
  40. }
  41. for (int i=1;i<=n;i++)printf("%d\n",ans[id[i]]);
  42. return 0;
  43. }
  44.