题目描述

【背景】
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. BestCoder Round #32_1001 以及 hdu 5182

    http://bestcoder.hdu.edu.cn/contests/contest_chineseproblem.php?cid=570&pid=1001 http://acm.hdu. ...

  2. 服务端性能测试 TPS

     针对服务器端的性能,以TPS为主来衡量系统的性能,并发用户数为辅来衡量系统的性能,如果必须要用并发用户数来衡量的话,需要一个前提,那就是交易在多长时间内完成,因为在系统负载不高的情况下,将思考时间( ...

  3. jmeter 非gui 模式跑jmx

    D:\study\apache-jmeter-3.0\bin>jmeter -n -t D:\study\apache-jmeter-3.0\基金排行.jmx -l D:\study\apach ...

  4. MyBatis --- 动态SQL、缓存机制

    有的时候需要根据要查询的参数动态的拼接SQL语句 常用标签: - if:字符判断 - choose[when...otherwise]:分支选择 - trim[where,set]:字符串截取,其中w ...

  5. js操作cookie 使用详解

    详见: http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp62  JavaScript中的另一个机制:cookie,则可以达到真正全 ...

  6. 从async await 报错Unexpected identifier 谈谈对上下文的理解

    原文首发地址: 先简单介绍下async await: async/await是ES6推出的异步处理方案,目的也很明确:更好的实现异步编程.   详细见阮大神 ES6入门 现在说说实践中遇到的问题:使用 ...

  7. 【.net 深呼吸】WPF 中的父子窗口

    与 WinForm 不同,WPF 并没有 MDI 窗口,但 WPF 的窗口之间是可以存在“父子”关系的. 我们会发现,Window 类公开了一个属性叫 Owner,这个属性是可读可写的,从名字上我们也 ...

  8. 制作Visual Studio 2017 (VS 2017) 离线安装包

    史上功能最强大的Visual Studio 2017版本发布,但是由于版本更新速度加快和与第三方工具包集成的原因,微软研发团队没有为这个版本提供离线下载的安装文件.如果用户处在一个与外网隔离的网络环境 ...

  9. 自制ACL+DHCP实验(初版)

    (实验用gns模拟器) ACL 实验拓扑: 实验要求: 1.1.1.1→3.3.3.3 不通 11.11.11.11→3.3.3.3 通 2.2.2.2→3.3.3.3 通 实验步骤: 步骤一:基本配 ...

  10. 个人作业3—个人总结(Alpha阶段)

    一.关于Alpha阶段的总结 1.我们团队的情况 关于我们拖拉机团队,大家在一起做项目的这几周算是比较团结.首先组长布置的任务,每个人都有认真去做,每次例会还会总结不足,提出改进,并且实施这些改进:其 ...