题目描述

有 n 个人,用1∼n 进行编号,每个人手里有一把手枪。一开始所有人都选定一个人瞄准(有可能瞄准自己)。然后他们按某个顺序开枪,且任意时刻只有一个人开枪。因此,对于不同的开枪顺序,最后死的人也不同。

Input

输入

人数 n<1000000

接下来 n 个数,依次为每个人的 aim

Output

输出只有一行,共两个数,为要求最后死亡数目的最小和最大可能。

Sample Input

8

2 3 2 2 6 7 8 5

Sample Output

3 5

分析

如果\(a\)瞄准\(b\),那么我们就从\(a\)到\(b\)建一条有向边

我们设最大存活程度为\(Max\),最小存活程度为\(Min\)

不难发现,入度为\(0\)的点必定存活(左图中的绿圈)

因为没有人会瞄准他

进一步分析可以发现,建好图后的联通块有两种情况

1、左图(非环)

显然,\(1\)号节点、\(4\)号节点必定存活,而他们所指的\(2\)号节点必死

问题就在\(3\)号节点,如果他先射杀\(2\)号节点,那么他的入度变为\(0\),存活人数为\(3\)

如果\(2\)号节点先射杀\(3\),那么三号节点的入度仍为\(1\),存活人数为\(2\)

所以,我们可以向拓扑排序那样维护入度为\(0\)的点,将其放入队列中

队首的目标必死,队首目标的目标可死可不死,打上标记

2、右图(环状)

最小存活:+1(无论如何都会剩一个人)

最大存活:隔一个人打一个,可以最大存活 len/2;

要特别判断自己打自己的环

代码

#include<stdio.h>
#include<queue>
#include<algorithm>
using namespace std;
const int maxn=1e6+5;
int n,Max,Min,q[maxn],aim[maxn],rd[maxn];
bool die[maxn],undie[maxn];
void Init(){
scanf("%d",&n);
for(int i=1;i<=n;++i){
scanf("%d",&aim[i]);
rd[aim[i]]++;
}
for(int i=1;i<=n;++i)//入度为0的点必活
if(rd[i]==0){
Min++;//最小必活数+1
q[++Max]=i;//队列维护的是入度为0的点
}
}
void Solve(){
int head=1;
while(head<=Max){//扫描队列
int cur=q[head];head++;//取出队首并出队
if(die[aim[cur]]) continue;//队首目标已死(多个入度为0的点指向一个点)
die[aim[cur]]=1;//队首目标必死
int live=aim[aim[cur]];//队首目标的目标可死可不死,看决策
rd[live]--;//
undie[live]=1;//可以让他活,但想死的时候随时可以让他死,在环可以最后死
if(rd[live]==0)//虽然入度为0,但不一定是必活,所以Min不加
q[++Max]=live;
}
//下面处理只剩下环
for(int i=1;i<=n;++i)
if(rd[i] && !die[i]){
int len=0,flag=0;//len记录环大小,flag标记环上是否有undie的点
for(int j=i;!die[j];j=aim[j]){
len++;
flag|=undie[j];
die[j]=1;//标记已死,避免其他的再来计算
}
if(!flag && len>1) Min++;//len=1表示自环,必死
Max+=len/2;
}
printf("%d %d",n-Max,n-Min);
}
int main(){
Init();
Solve();
return 0;
}

错题重错之枪战Maf的更多相关文章

  1. Java 整体测试重点题 错题积累

    重点题    错题积累 1: 解析: %d:用来设置输出日志的日期和时间 %m:用来输出代码中指定的消息 %n:用来输出一个回车换行符 %l:用来输出日志事件的发生位置 %p:用来输出优先级 %f:用 ...

  2. Ajax与JqueryUI和EasyUI错题总结

    Ajax与JqueryUI和EasyUI错题总结 正确答案A,解析:此题考察的是JQuery UI下的menu插件的使用,menu提供ui-state-disabled class 方法禁用任何菜单项 ...

  3. 错题集锦(二) -- Java专项

    错题集锦(二) -- Java专项 标签(空格分隔): 找工作 JVM的内存模型 线程共享: 堆(Heap):主要存放一些对象实例 方法区(Method Area / Non-Heap):用于存储已被 ...

  4. objective-c 错题

    //1, NSString *name = [[NSString alloc]initWithString:@"张三"]; NSLog(@"%d",[name ...

  5. hibernate错题解析

    01 Hibernate错题分析   解析: 此题目考查的是对Hibernate中交叉连接的理解.HQL支持SQL风格的交叉连接查询,交叉连接适用于两个类之间没有定义任何关联时.在where字句中,通 ...

  6. 20175316盛茂淞 《java程序设计》第三周课堂测试错题总结

    20175316盛茂淞 <java程序设计>第三周课堂测试错题总结 出现问题 错题总结 题目1 在Ubuntu中用自己的有位学号建一个文件,教材p87 Example4_15 1. 修改代 ...

  7. NOIp2014提高组初赛错题简析

    总体分析 \(89pts\),粗略来看选择题错的比较多,\(-6pts\).同时又是尿性的填空杀扣了\(5pts\). 不过后面的两大题全对了还是可喜可贺 错题精析 单项选择T8 编译器的主要功能是( ...

  8. Java多线程习题 ===重点 ,错题积累

    多线程重点,错题分析 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: . 12: 13: 14: 15:

  9. S2 深入.NET和C#编程 笔试测试错题积累

    ---恢复内容开始--- <深入.NET平台和C#编程>内部测试题-笔试试卷错题积累 1: 1) 以下关于序列化和反序列化的描述错误的是( C). a) 序列化是将对象的状态存储到特定存储 ...

随机推荐

  1. JAVA多线程实现的三种方法

    JAVA多线程实现方式主要有三种:继承Thread类.实现Runnable接口.使用ExecutorService.Callable.Future实现有返回结果的多线程.其中前两种方式线程执行完后都没 ...

  2. 双剑合璧 Nacos 结合 Sentinel 实现流量安全控制

    Alibaba Sentinel 是一款高性能且轻量级的流量控制.熔断降级解决方案.是面向分布式服务架构的高可用流量控制组件. Sentinel 官网:https://sentinelguard.io ...

  3. 重学 Java 设计模式:实战外观模式「基于SpringBoot开发门面模式中间件,统一控制接口白名单场景」

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 你感受到的容易,一定有人为你承担不容易 这句话更像是描述生活的,许许多多的磕磕绊绊总 ...

  4. 【前端】仿消息推送到App提示

    效果: JS: (function ($) { $.fn.loopmsg = function (options, param) {   if (typeof options == 'string') ...

  5. cookie常用函数

    cookie常用函数 web_add_cookie:添加新的cookie或修改已经存在的cokkies web_remove_cookie:删除指定的cookie web_cleanup_cookie ...

  6. 如何获取Apollo上项目下的所有namespace?

    背景 项目配置迁移到Apollo之后,通过统一的配置管理及配置监听使得项目配置修改的成本大大降低. 但是,在使用Apollo的过程中,强哥也遇到一个问题:如果我们要获取Apollo下的namespac ...

  7. 03.DRF-设计方法

    RESTful设计方法 1. 域名 应该尽量将API部署在专用域名之下. https://api.example.com 如果确定API很简单,不会有进一步扩展,可以考虑放在主域名下. https:/ ...

  8. vc6.0转vs2012的一些错误与解决方法

    1>------ 已启动生成: 项目: NMW210, 配置: Debug Win32 ------ abs_position = fabs((float)posiTemp1 - (float) ...

  9. cb33a_c++_STL_算法_查找算法_(6)binary_search_includes

    cb33a_c++_STL_算法_查找算法_(6)binary_search_includes//针对已序区间的查找算法,如set,multiset关联容器-自动排序binary_search(b,e ...

  10. weui上传多图片,前端压缩,base64编码

    记录一下在做一个报修功能的心路历程,需求功能很简单,一个表单提交,表单包含简单的文字字段以及图片 因为使用的是weui框架,前面的话去找weui的表单和图片上传组件,说实话,weui的组件写的还不错, ...