标签:cnt int 染色 查集 merge 补题 2022 Find 选拔赛
E ginger的染色
首先对于一个排列 ,如果看成环图的结构,那么 就向 连一条无向边。所以对于任意一个排列就会产生若干个环,连通性可以
用并查集维护,现在对每个点进行黑白染色,题意转换为对于环中任意相邻两点颜色不能相同,那么只有偶数元环才能够染色成二
分图,而每个偶环的方案数为 ,设当前有 个环,总答案就为 ,当且仅当所有的环都为偶环时存在答案,否则答案为0
ps:当时想的就是看有几个环,但是不知道怎么把它们放在一块,没想到是并查集,唉
#include <bits/stdc++.h> using namespace std; typedef long long ll; const int mod=998244353,N=1e5+10; int p[N],cnt[N]; int Find(int x) { if (p[x]!=x)p[x]=Find(p[x]); return p[x]; } void merge(int a,int b) { a=Find(a),b=Find(b); if (a!=b) { p[a]=b; cnt[b]+=cnt[a]; } } signed main() { ios::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n; cin>>n; for (int i=1; i<=n; i++) p[i]=i,cnt[i]=1; for (int i=1; i<=n; i++) { int x; cin>>x; merge(i,x); } int ans=1; for (int i=1;i<=n;i++) { if (p[i]==i) { if (cnt[i]%2) { printf("0\n"); return 0; } else ans=ans*2%mod; } } printf("%d\n",ans%mod); return 0; }
标签:cnt,int,染色,查集,merge,补题,2022,Find,选拔赛 来源: https://www.cnblogs.com/Mercury1988/p/16398440.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。