题目链接:http://codeforces.com/contest/760/problem/C

题意:有n个烤串,并且每个烤串起初都放在一个火盆上并且烤串都正面朝上,现在定义p序列,p[i]表示在i位置的烤串下一步会转移到p[i]位置的火盆上;定义b序列,
b[i]为1表示每有烤串移动到i火盆上时,该烤串就要翻面。 现在要求n个烤串每个烤串都要经过所有的火盆并且最终回到自己初始的火盆上并且翻面朝上。 求最少的
序列修改。

思路:首先考虑让每一个烤串都要经过所有的火盆并且回到起初的火盆,那么p序列只能是环,由于输入的p序列可能形成多个环,那么把多个环合并成一个环最少要修改的次数为环的数目(特判只有一个环的时候,因为只有一个环不需要修改)。接下来考虑最终要翻面朝上,由于n个位置都要经过所以如果sum(b[i])为偶数,那么最终肯定还是正面,所以只需让sum(b[i])为奇数即可。

import java.io.PrintWriter;
import java.util.*; public class Main {
public static final int MAXN=200000+10;
public static int p[]=new int [MAXN];
public static int b[]=new int [MAXN];
public static boolean vis[]=new boolean [MAXN];
public static void dfs(int u){
if(vis[u]==true){
return;
}
vis[u]=true;
dfs(p[u]);
}
public static void main(String[] args) {
Scanner cin = new Scanner(System.in);
PrintWriter out = new PrintWriter(System.out);
int n=cin.nextInt();
for(int i=1;i<=n;i++){
p[i]=cin.nextInt();
}
int sumb=0;
for(int i=1;i<=n;i++){
b[i]=cin.nextInt();
sumb+=b[i];
}
int ans=0;
Arrays.fill(vis, false);
for(int i=1;i<=n;i++){
if(vis[i]==false){
ans++;
dfs(i);
}
}
if(ans!=1){
ans=ans+(sumb%2==1?0:1);
}else{
ans=(sumb%2==1?0:1);
}
out.println(ans);
cin.close();
out.flush();
}
}

Codeforces Round #393 (Div. 2) - C的更多相关文章

  1. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) E - Nikita and stack 线段树好题

    http://codeforces.com/contest/760/problem/E 题目大意:现在对栈有m个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...

  2. Codeforces Round #393 (Div. 2) - B

    题目链接:http://codeforces.com/contest/760/problem/B 题意:给定n张床,m个枕头,然后给定某个特定的人(n个人中的其中一个)他睡第k张床,问这个人最多可以拿 ...

  3. Codeforces Round #393 (Div. 2) - A

    题目链接:http://codeforces.com/contest/760/problem/A 题意:给定一个2017年的月份和该月的第一天的星期,问该月份的日历表中需要多少列.行有7列表示星期一~ ...

  4. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition) D - Travel Card

    D - Travel Card 思路:dp,类似于单调队列优化. 其实可以写的更简单... #include<bits/stdc++.h> #define LL long long #de ...

  5. Codeforces Round #393 (Div. 2) (8VC Venture Cup 2017 - Final Round Div. 2 Edition)A 水 B 二分 C并查集

    A. Petr and a calendar time limit per test 2 seconds memory limit per test 256 megabytes input stand ...

  6. 【线段树】Codeforces Round #393 (Div. 1) C. Nikita and stack

    就是给你一些元素的进栈 出栈操作,不按给定的顺序,要求你对于每次输入,都依据其及其之前的输入,判断出栈顶的元素是谁. 用线段树维护,每次push,将其位置的值+1,pop,将其位置的值-1.相当于寻找 ...

  7. 【二分】【动态规划】Codeforces Round #393 (Div. 1) B. Travel Card

    水dp,加个二分就行,自己看代码. B. Travel Card time limit per test 2 seconds memory limit per test 256 megabytes i ...

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

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

  9. Codeforces Round #393 (Div. 2)

    A. Petr and a calendar time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...

随机推荐

  1. rocketmq启动broker内存占用过大的问题

    解决方法: 修改broker启动脚本runbroker.sh里面的jvm参数 JAVA_OPT="${JAVA_OPT} -server -Xms8g -Xmx8g -Xmn4g" ...

  2. centos 6.5 安装 dubbo 管理中心

    从http://pan.baidu.com/s/1dDlI7aL下载dubbo-admin-2.5.4.war包,将下载的包放在tomcat的webapps目录,启动tomcat自动解压该war包,然 ...

  3. 033:DTL常用过滤器(2)

    date过滤器: date过滤器:将一个日期按照指定的格式,格式化成字符串.示例代码如下: views.py: from datetime import datetime def cur_date(r ...

  4. [HYSBZ - 3252] 攻略

    问题描述 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX 半岛>,这款游戏有n个场景(scene),某 ...

  5. Counter的数据统计功能

    Counter是dict的子类,一般用于统计,默认排序是从大到小 from collections import Counter # 输入iterable对象即可 str_counter = Coun ...

  6. ubuntu 18.04下修改pip镜像源

    在home/用户名/目录下创建.pip文件夹 然后cd .pip 创建pip.conf文件touch pip.conf 输入以下内容然后保存即可 [global] timeout = 6000 ind ...

  7. cordova+vue做的app解决引入cordova-plugin-splashscreen后启动先显示黑屏在显示启动页

    先上项目目录结构cordova项目结构 android platform 结构 图中用红框框起来的为主要修改文件 这篇主要的讲cordova项目引用了cordova-plugin-splashscre ...

  8. oracle基础sql

    二.SQL Structur query language 结构化查询语言,是操作关系型数据库中的对象. DDL(Data definition language 数据定义语言),用于建表或删表操作, ...

  9. logback-spring.xml配置文件

    <?xml version="1.0" encoding="UTF-8"?> <configuration debug="false ...

  10. Linux学习篇(一)-初识Linux

    开源许可协议 简单了解开源许可协议,一张图读懂. linux 系统特点 linux 特点安全性高.高可用.高性能 稳定且有效率 免费或少许免费 漏洞少且快速修补 多任务多用户 更加安全的用户及文件权限 ...