Codeforces Round #393 Pavel and barbecue

来源:互联网 发布:学生请假软件 编辑:程序博客网 时间:2024/04/30 11:13

每个串都要经过n个位置,每个位置都要有翻转和不翻转两种情况,根据 p [ i ] 求出组成多少个环,求连成一个环需要改变的次数(1个环ans = 0,否则ans = 环数)

每个串都要有翻转和不翻转两种情况,所以 b [ ]中1的个数应为奇数,否则ans+1 

#include <iostream>#include <stdio.h>#include <string.h>#include <algorithm>#include <queue>#include <vector>#include <map>#include <cmath>#include <stdlib.h>using namespace std;const double PI = acos(-1.0);const double eps = 1e-8;const int MAX = 2e5+10;const int mod = 1e9+7;int p[MAX], vis[MAX], b[MAX], n;void dfs(int i){    vis[i] = 1;    if(!vis[p[i]])dfs(p[i]);}int main(){    cin>>n;    int ans = 0;    memset(vis, 0, sizeof(vis));    for(int i = 1; i<=n; ++i)        scanf("%d", &p[i]);    for(int i = 1; i<=n; ++i)        if(!vis[i])        {            dfs(i);            ans++;        }    if(ans==1)ans--;    int zero = 0, one = 0;    for(int i = 1; i<=n; ++i)    {        scanf("%d", &b[i]);        if(b[i])one++;        else zero++;    }    if(one%2==0)ans++;    cout<<ans<<endl;    return 0;}

0 0