LINK

题意:给出n个数,\(a_i\)代表下一步会移动到第\(a_i\)个位置,并继续进行操作,\(b_i\)1代表进行一次翻面操作,要求不管以哪个位置上开始,最后都能满足

1.到达过所有位置

2.对到达的任意位置,都已经进行过奇次和偶次翻面操作

交换任意两个\(a_i\),或修改\(b_i\)的值算做一次操作

问最小操作数。

思路:首先可以知道,要满足条件1,必须使该排列的循环节长度为1(即所有数成一个环),再者要满足条件2,则\(b_i==1\)必须有奇数个。

那么很简单,对所有未标记的数dfs一遍,进行的dfs次数就是循环节长度,再统计\(b_i\)中1的个数即可。

/** @Date    : 2017-04-09 21:10:36
* @FileName: 760C DFS.cpp
* @Platform: Windows
* @Author : Lweleth (SoundEarlf@gmail.com)
* @Link : https://github.com/Lweleth
* @Version : $Id$
*/
#include<bits/stdc++.h>
#define LL long long
#define PII pair
#define MP(x, y) make_pair((x),(y))
#define fi first
#define se second
#define PB(x) push_back((x))
#define MMG(x) memset((x), -1,sizeof(x))
#define MMF(x) memset((x),0,sizeof(x))
#define MMI(x) memset((x), INF, sizeof(x))
using namespace std; const int INF = 0x3f3f3f3f;
const int N = 2e5+20;
const double eps = 1e-8; int a[N], b[N];
int vis[N];
void dfs(int x)
{
vis[x] = 1;
if(vis[a[x]] == 0)
dfs(a[x]);
} int main()
{
int n;
while(cin >> n)
{
MMF(vis);
for(int i = 1; i <= n; i++)
scanf("%d", a + i);
for(int i = 1; i <= n; i++)
scanf("%d", b + i);
int ans = 0;
int cnt = 0;
for(int i = 1; i <= n; i++)
{
if(!vis[i])
dfs(i), ans++;
if(b[i])
cnt++;
}
if(ans == 1)
ans--;
printf("%d\n", ans + ((cnt%2)?0:1));
}
return 0;
}

CF760 C. Pavel and barbecue 简单DFS的更多相关文章

  1. Codeforces 760C:Pavel and barbecue(DFS+思维)

    http://codeforces.com/problemset/problem/760/C 题意:有n个盘子,每个盘子有一块肉,当肉路过这个盘子的时候,当前朝下的这一面会被煎熟,每个盘子有两个数,p ...

  2. CodeForces 760 C. Pavel and barbecue(dfs+思维)

    题目链接:http://codeforces.com/contest/760/problem/C 题意:一共有N个烤炉,有N个烤串,一开始正面朝上放在N个位子上.一秒之后,在位子i的串串会移动到pi位 ...

  3. Red and Black(简单dfs)

    Red and Black Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tot ...

  4. 【置换群】Codeforces Round #393 (Div. 1) A. Pavel and barbecue

    就是先看排列p,必须满足其是一个环,才满足题意.就处理出有几个环,然后把它们合起来,答案就是多少. 然后再看序列b,自己稍微画一画就会发现,如果有偶数个1肯定是不行哒,否则,它就会再置换一圈回到它自己 ...

  5. Pavel and barbecue

    Pavel and barbecue time limit per test 2 seconds memory limit per test 256 megabytes input standard ...

  6. POJ 1979 Red and Black (简单dfs)

    题目: 简单dfs,没什么好说的 代码: #include <iostream> using namespace std; typedef long long ll; #define IN ...

  7. 【codeforces 760C】Pavel and barbecue

    time limit per test2 seconds memory limit per test256 megabytes inputstandard input outputstandard o ...

  8. POJ1573(Robot Motion)--简单模拟+简单dfs

    题目在这里 题意 : 问你按照图中所给的提示走,多少步能走出来??? 其实只要根据这个提示走下去就行了.模拟每一步就OK,因为下一步的操作和上一步一样,所以简单dfs.如果出现loop状态,只要记忆每 ...

  9. POJ1979 Red and Black (简单DFS)

    POJ1979 Description There is a rectangular room, covered with square tiles. Each tile is colored eit ...

随机推荐

  1. 【Alpha】阶段第三次Scrum Meeting

    [Alpha]阶段第三次Scrum Meeting 工作情况 团队成员 今日已完成任务 明日待完成任务 刘峻辰 更新评论接口 获取课程评论接口 赵智源 编写脚本实现持续集成 整合前端进行部署 肖萌威 ...

  2. 冲刺ing-4

    第四次Scrum冲刺 队员完成的任务 队员 完成任务 吴伟华 Leangoo的看板截图,燃尽图 蔺皓雯 编写博客,学习后端设计 蔡晨旸 学习后端设计 曾茜 后端设计 鲁婧楠 服务器建构 杨池宇 学习后 ...

  3. 周总结<4>

    经过了一周的学习,我们在html以及C语言方面又有的新的知识点的学习. html 自习表格,函数等 C语言 哈弗曼编码 Html案例: 一. <!DOCTYPE html PUBLIC &quo ...

  4. Spring学习(六)—— Spring注解(二)

    核心原理 1.       用户发送请求给服务器.url:user.do 2.       服务器收到请求.发现Dispatchservlet可以处理.于是调用DispatchServlet. 3.  ...

  5. 1st 英文文章词频统计

    英文文章词频统计: 功能:统计一篇英文文章的单词总数及出现频数并输出,之后排序,输出频数前十的单词及其频数. 实现方法:使用C语言,用fopen函数读入txt文件,fscanf函数逐个读入单词,结构体 ...

  6. php多维数组排序 3

    本文实例讲述了php简单实现多维数组排序的方法.分享给大家供大家参考,具体如下: 之前在做一个功能的时候,必须要把数据放到二维数组里并且排序,然后上网找找解决思路, 这时候会用到array_multi ...

  7. Fn+F1-F12,避免使用FN+

    用惯了win8.1,再用win10 很不习惯使用FN+F1-F12 如果要避免使用FN+:使用[FN+ESC]

  8. Delphi通过ADO链接数据库及对数据库的增加,删除,修改,读取操作实例教程4

    ADO是一种程序对象,用于表示用户数据库中的数据结构和所包含的数据.ADO(ActiveXDataObjects,ActiveX数据对象)是Microsoft提出的应用程序接口(API)用以实现访问关 ...

  9. 内存测试——Android Studio中对应进程的Heap

    通过Android Studio的Heap查看该程序的目前占用内存大小,多次进出界面,观察内存内存大小的变化.用Heap监测应用进程使用内存情况的步骤如下: 1. 启动Android Studio—& ...

  10. resp.getWriter().print的注意点