Codeforces Round #393 (Div. 2) - C
题目链接: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的更多相关文章
- 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个操作,但是顺序是乱的,现在每输入一个操作要求你输出当前的栈顶, 注意,已有操作要按它们的 ...
- Codeforces Round #393 (Div. 2) - B
题目链接:http://codeforces.com/contest/760/problem/B 题意:给定n张床,m个枕头,然后给定某个特定的人(n个人中的其中一个)他睡第k张床,问这个人最多可以拿 ...
- Codeforces Round #393 (Div. 2) - A
题目链接:http://codeforces.com/contest/760/problem/A 题意:给定一个2017年的月份和该月的第一天的星期,问该月份的日历表中需要多少列.行有7列表示星期一~ ...
- 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 ...
- 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 ...
- 【线段树】Codeforces Round #393 (Div. 1) C. Nikita and stack
就是给你一些元素的进栈 出栈操作,不按给定的顺序,要求你对于每次输入,都依据其及其之前的输入,判断出栈顶的元素是谁. 用线段树维护,每次push,将其位置的值+1,pop,将其位置的值-1.相当于寻找 ...
- 【二分】【动态规划】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 ...
- 【置换群】Codeforces Round #393 (Div. 1) A. Pavel and barbecue
就是先看排列p,必须满足其是一个环,才满足题意.就处理出有几个环,然后把它们合起来,答案就是多少. 然后再看序列b,自己稍微画一画就会发现,如果有偶数个1肯定是不行哒,否则,它就会再置换一圈回到它自己 ...
- Codeforces Round #393 (Div. 2)
A. Petr and a calendar time limit per test:2 seconds memory limit per test:256 megabytes input:stand ...
随机推荐
- Python比较两个excel文档内容的异同
#-*- coding: utf-8 -*- #比对两个Excel文件内容的差异#---------------------假设条件----------------#1.源表和目标表格式一致#2.不存 ...
- 对webpack的初步研究4
Mode string module.exports = { mode: 'production' }; webpack --mode=production The following string ...
- 【ElasticSearch】概念
小史是一个非科班的程序员,虽然学的是电子专业,但是通过自己的努力成功通过了面试,现在要开始迎接新生活了. 对小史面试情况感兴趣的同学可以观看面试现场系列. 随着央视诗词大会的热播,小史开始对诗词感兴趣 ...
- Spring中@Async-异步处理
在Java应用中,绝大多数情况下都是通过同步的方式来实现交互处理的:但是在处理与第三方系统交互的时候,容易造成响应迟缓的情况,之前大部分都是使用多线程来完成此类任务,其实,在spring 3.x之后, ...
- ubuntu python3相关
安装pip3 sudo apt install python3-pipsudo apt-get install python3-virtualenv sudo pip3 install virtual ...
- 在google chrome浏览器上安装 Vue Devtools工具
[转]https://www.cnblogs.com/tanyongli/p/7554045.html Vue.js devtools是基于google chrome浏览器的一款调试vue.js应用的 ...
- EZOJ #373排序
分析 它居然真的是个nlog^3暴力?! 两个数在加小于min(lowbit(x),lowbit(y))的数时对他们的奇偶性不影响 因此每次加上min(lowbit(x),lowbit(y))判断此时 ...
- 1208D Restore Permutation
题目大意 给你一个序列s 让你求一个1~n的序列 使得对于第i个位置它前面所有小于p[i]的数的和恰好为s[i] 分析 我们可以从后往前确定每一位 每次一二分找到恰好等于s[i]的数 但是我们发现这样 ...
- Nodejs - 交互式管理 Node.js 版本
n - npm:Interactively Manage Your Node.js Versions. Unfortunately n is not supported on Windows. npm ...
- 《图解设计模式》读书笔记5-1 composite模式
目录 代码 角色 想法 Composite模式即组合模式.它能够使容器和内容具有一致性,创造出递归结构. 举个例子:在文件系统中,文件夹既是内容,也是容器,具有一致性,这样一来,文件系统形成递归结构. ...