Java教程

2022暑假集训队选拔赛补题

本文主要是介绍2022暑假集训队选拔赛补题,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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;
}

 

这篇关于2022暑假集训队选拔赛补题的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!