题目描述

【背景】
ZCC又在打Isaac。这次他打通了宝箱关进入了表箱关。
【题目描述】
表箱关有一个房间非常可怕,它由n个变异天启组成。
每个天启都会在进入房间后吐出绿弹并炸向某一个位置且范围内只有一个天启。若该位置的天启已经死亡则没有事情发生,否则该位置的天启会死亡。每个天启只能且必须吐一次绿弹(除非在它吐弹以前他就挂了)。
绿弹的飞行速度很快,在某个绿弹落地之前不会有新的绿弹被吐出。
虽然房间的天启位置和吐弹位置固定,但是吐弹顺序是随机的,所以ZCC不能很好地制定策略。
现在ZCC想知道,最少和最多有几个天启被干掉。

输入

第一行n表示天启个数。
第二行n个数ai表示i号天启的目标是ai。
注意:行末有一个空格。

输出

一行两个数表示最少和最多有几个天启被干掉。

样例输入

8
2 3 2 2 6 7 8 5

样例输出

3 5

提示

 
 
 
 
 
 
 
 

【样例解释】

【数据范围】

测试点编号

n的范围

其他

测试点编号

n的范围

其他

1

=10

随机生成

6

=10000

处于一个联通块

2

=100

随机生成

7

=100000

所有天启都能被炸到

3

=1000

随机生成

8

=100000

4

=1000

随机生成

9

=1000000

处于一个联通块

5

=10000

随机生成

10

=1000000

题解

这道题刚开始弄了我很久,后来发现每个点只会向后连一条边,这样就少了很多种特殊情况

这道题要我们求最少和最多被干掉的天启数量

我们把图的情况想象成  单独一个环和其他的情况

求最少的数量

我们对于单独的环最少一定是干掉  (环的长度+1)/2  个天启

而对于其他的情况 我们就从入度为0的点开始往后找,把这些点标记掉,再找入度为0的点,这样继续,在判断的时候把干掉的加起来即可

求最大的数量

单独的环最后一定是只剩下一个(自环除外),自环就要特判一下

其他情况就只有入度为0的点存活,其他都会被干掉

怎么求单独的环呢?这个问题确实弄了我很久

其实我们可以先把入度为0的点向后找,边找边标记,一直找到找不了为止,这样剩下来的点就是构成环的点了

 #include<bits/stdc++.h>
#define N 1000005
using namespace std;
int n,cnt,Max,Min,k,u,v;
int a[N],in[N],s[N],flag[N];
int calc(int u){
flag[u]=;
int sum=,v=u;
while (!flag[a[v]]){
flag[a[v]]=;
sum++;
v=a[v];
}
if (sum==) sum=;
return sum;
}
int main(){
scanf("%d",&n);
for (int i=;i<=n;i++){
scanf("%d",&a[i]);
in[a[i]]++;
}
for (int i=;i<=n;i++)
if (!in[i]) s[++cnt]=i,flag[i]=true;
int num=;
while (num<=cnt){
k=s[num];
u=a[k];
if (!flag[u]){
Min++; flag[u]=true;
v=a[u];
in[v]--;
if (!in[v]){
s[++cnt]=v;
flag[v]=true;
}
}
num++;
}
for (int i=;i<=n;i++)
if (!flag[i]) Min+=(calc(i)+)/;
memset(flag,,sizeof(flag));
for (int i=;i<=n;i++)
in[a[i]]++;
cnt=;
for (int i=;i<=n;i++)
if (!in[i]) s[++cnt]=i,flag[i]=true;
num=;
while (num<=cnt){
k=s[num];
u=a[k];
if (!flag[u]){
Max++; flag[u]=true;
s[++cnt]=u;
}
num++;
}
for (int i=;i<=n;i++)
if (!flag[i]) Max+=calc(i)-;
printf("%d %d\n",Min,Max);
return ;
}

YYHS-NOIP2017Training0928-ZCC loves Isaac的更多相关文章

  1. 3828. 三角形计数 3829. ZCC loves Isaac 3830. 字符消除

    3828 给定n个点的坐标(0<=xi,yi<=10000)求选出任意三个点能组成的三角形的总面积. 题解 太naive了 枚举三角形的y最小的点,把剩余的点按角度排序 然后随便算,可以用 ...

  2. 2014---多校训练2(ZCC Loves Codefires)

    ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Othe ...

  3. HDU 4876 ZCC loves cards(暴力剪枝)

    HDU 4876 ZCC loves cards 题目链接 题意:给定一些卡片,每一个卡片上有数字,如今选k个卡片,绕成一个环,每次能够再这个环上连续选1 - k张卡片,得到他们的异或和的数,给定一个 ...

  4. HDU-4882 ZCC Loves Codefires

    http://acm.hdu.edu.cn/showproblem.php?pid=4882 ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Ot ...

  5. HDU 4882 ZCC Loves Codefires (贪心)

    ZCC Loves Codefires 题目链接: http://acm.hust.edu.cn/vjudge/contest/121349#problem/B Description Though ...

  6. hdu 4873 ZCC Loves Intersection(大数+概率)

    pid=4873" target="_blank" style="">题目链接:hdu 4873 ZCC Loves Intersection ...

  7. HDU 4882 ZCC Loves Codefires(贪心)

     ZCC Loves Codefires Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  8. hdu 4882 ZCC Loves Codefires(数学题+贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4882 ------------------------------------------------ ...

  9. hdu 4876 ZCC loves cards(暴力)

    题目链接:hdu 4876 ZCC loves cards 题目大意:给出n,k,l,表示有n张牌,每张牌有值.选取当中k张排列成圈,然后在该圈上进行游戏,每次选取m(1≤m≤k)张连续的牌,取牌上值 ...

  10. 多校训练赛2 ZCC loves cards

    ZCC loves cards Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) ...

随机推荐

  1. Animate.css 一款牛逼的css3动画库

    Animate.css是一款很牛逼的,跨浏览器的css3动画库,使用方法也很简单只要引入一个animate.min.css就可以了, 简单使用 1 首先引入 animate的 css 文件样式 cdn ...

  2. Sentry的安装搭建与使用

    业务监控工具 Sentry 的搭建与使用 官方网址 Django Sentry 官网链接 Sentry 简介 Sentry 是一个开源的实时错误报告工具,支持 web 前后端.移动应用以及游戏,支持 ...

  3. python基础教程(九)

    python异常 python用异常对象(exception object)来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的 回溯(Traceback, 一种错误 ...

  4. Mybatis --- 创建方法、全局配置

    总体介绍:MyBatis实际上是Ibatis3.0版本以后的持久化层框架[也就是和数据库打交道的框架]!     和数据库打交道的技术有:      原生的JDBC技术--->Spring的Jd ...

  5. js,jQuery实现可关闭悬浮框广告特效,兼容(谷歌,火狐,Ie)

    注意不能直接用close()命名关闭广告函数,避免冲突. javascript实现方法: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Tr ...

  6. (一)Builder(建造者)模式

    我们一般在构建javabean的对象的时候通常有三种写法: 1.直接通过构造函数传参的方式设置属性,这种方法如果属性过多的话会让构造函数十分臃肿,而且不能灵活的选择只设置某些参数. 2.采用重叠构造区 ...

  7. 正则语言引擎:一个简单LEX和YACC结合运用的实例

    本文先描述了LEX与YACC的书写方法.然后利用LEX与YACC编写了一个简单正则语言的引擎(暂时不支持闭包与或运算),生成的中间语言为C语言. 正则引擎应直接生成NFA或DFA模拟器的输入文件,但在 ...

  8. Java中死锁的简单例子及其避免

    死锁:当一个线程永远地持有一个锁,并且其他线程都尝试获得这个锁时,那么它们将永远被阻塞.比如,线程1已经持有了A锁并想要获得B锁的同时,线程2持有B锁并尝试获取A锁,那么这两个线程将永远地等待下去. ...

  9. [转载]GIF、JPEG 和 PNG的区别在哪里?

    原文地址:GIF.JPEG 和 PNG的区别在哪里?作者:苗得雨 GIF.JPEG 和 PNG 是三种最常见的图片格式. GIF:1987 年诞生,常用于网页动画,使用无损压缩,支持 256 种颜色( ...

  10. 转:【Java集合源码剖析】Java集合框架

    转载轻注明出处:http://blog.csdn.net/ns_code/article/details/35564663   Java集合工具包位于Java.util包下,包含了很多常用的数据结构, ...