枪战(maf)

settle the dispute. Negotiations were very tense, and at one point the trigger-happy participants drew their

guns. Each participant aims at another with a pistol. Should they go on a killing spree, the shooting will go

in accordance with the following code of honour:

the participants shoot in a certain order, and at any moment at most one of them is shooting,

no shooter misses, his target dies instantly, hence he may not shoot afterwards,

everyone shoots once, provided he had not been shot before he has a chance to shoot,

no participant may change his first target of choice, even if the target is already dead (then the shot

causes no further casualties).

An undertaker watches from afar, as he usually does. After all, the mobsters have never failed to stimulate

his business. He sees potential profit in the shooting, but he would like to know tight estimations. Precisely

he would like to know the minimum and maximum possible death rate. The undertaker sees who aims at

whom, but does not know the order of shooting. You are to write a programme that determines the numbers

reads from the standard input what target each mobster has chosen,

determines the minimum and maximum number of casualties,

输入

第1行:人数 1<=n<=1,000,000

第2行:包含了n 个整数s1,s2,...,sn,si表示第i个人瞄准的目标,注意一下第i个的目标可能为i 。

输出

输出2个整数。枪战后可能的最小和最大的死亡人数。


solution

考虑贪心。

首先没有入度的点一定不会死。假设为A

那么他们瞄准的人B一定会死,而B瞄准的人可能可以不死。

于是删除B的出边,类似拓扑序,一个点如果没有入边,它就可以不死。

还剩下若干环。

环上的点最少死n/2

最多:

1.如果这个环有入边(就是它不是一个单独的环,环外可以打到环上)

那么可以全死。因为让那个被环外打的人开枪

不然会活一个人

#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define maxn 1000006
using namespace std;
int n,a[maxn],in[maxn];
int q[maxn],l,r,ans1,ans2,die[maxn];//ans1 min ans2 max
int flag[maxn];
int main()
{
cin>>n;
for(int i=1;i<=n;i++){scanf("%d",&a[i]);in[a[i]]++;}
for(int i=1;i<=n;i++){
if(!in[i])q[++r]=i,ans1++;
}
for(int i=1;i<=r;i++){
int u=q[i];int v=a[u];
if(die[v])continue;
die[v]=1;
in[a[v]]--;flag[a[v]]=1;// flag=1 exist a entrance
if(!in[a[v]])q[++r]=a[v];
}
ans2=r;
for(int i=1;i<=n;i++){
if(in[i]&&!die[i]){// in the circle
int len=0,en=0;
for(int j=i;!die[j];j=a[j]){
die[j]=1;len++;
en|=flag[j];
}
if(!en&&len>1)ans1++;//can't enter
ans2+=len/2;
}
}
printf("%d %d\n",n-ans2,n-ans1);
return 0;
}

枪战(maf)的更多相关文章

  1. BZOJ 1124: [POI2008]枪战Maf

    1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 617  Solved: 236[Submit][Status ...

  2. [POI2008]枪战Maf

    [POI2008]枪战Maf 题目 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的 ...

  3. [BZOJ 1124][POI 2008] 枪战 Maf

    1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 659  Solved: 259[Submit][Status ...

  4. bzoj 1124 [POI2008]枪战Maf 贪心

    [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 741  Solved: 295[Submit][Status][Disc ...

  5. 【BZOJ1124】[POI2008]枪战Maf 贪心+思路题

    [BZOJ1124][POI2008]枪战Maf Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开 ...

  6. [POI2008]枪战Maf题解

    问题 C: [POI2008]枪战Maf 时间限制: 1 Sec  内存限制: 256 MB 题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺 ...

  7. BZOJ1124 [POI2008]枪战Maf[贪心(证明未完成)+拓扑排序]

    吐槽:扣了几个小时,大致思路是有了,但是贪心的证明就是不会, 死磕了很长时间,不想想了,结果码代码又不会码.. 深深体会到自己码力很差,写很多行还没写对,最后别人代码全一二十行,要哭了 以下可能是个人 ...

  8. 枪战Maf[POI2008]

    题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. 输入 输入n人 ...

  9. bzoj1124[POI2008]枪战maf

    这代码快写死我了.....死人最多随便推推结论.死人最少,每个环可以单独考虑,每个环上挂着的每棵树也可以分别考虑.tarjan找出所有环,对环上每个点,求出选它和不选它时以它为根的树的最大独立集(就是 ...

  10. 【BZOJ】1124: [POI2008]枪战Maf

    题意 \(n(n < 1000000)\)个人,每个人\(i\)指向一个人\(p_i\),如果轮到\(i\)了且他没死,则他会将\(p_i\)打死.求一种顺序,问死的人最少和最多的数目. 分析 ...

随机推荐

  1. C++使用GDI+实现图片格式转换

    主要是我在设置壁纸时遇到的个小问题,因为设置壁纸只能是bmp格式的图片,不可能我喜欢的壁纸就都是bmp格式的,就想怎么转换一下图片的格式,于是就在百度搜怎么弄,搜到了可行方法,却没有实现代码,有些看起 ...

  2. BeanUtils工具的实现

    BeanUtils工具的实现 自定义一个将数据映射到类里的方法 方法一: package utils; import java.lang.reflect.Field; import java.lang ...

  3. Servlet学习笔记02——什么是http协议?

    1.http协议 (了解) (1)什么是http协议? 是一种网络应用层协议,规定了浏览器与web服务器之间 如何通信以及相应的数据包的结构. 注: a.tcp/ip: 网络层协议,可以保证数据可靠的 ...

  4. 最小化 Java 镜像的常用技巧

    背景 随着容器技术的普及,越来越多的应用被容器化.人们使用容器的频率越来越高,但常常忽略一个基本但又非常重要的问题 - 容器镜像的体积.本文将介绍精简容器镜像的必要性并以基于 spring boot ...

  5. webstorm报错Unescaped xml character解决方案1

    当idea认为你的书写格式不适合的时候便会报出Unescaped xml character提示,但不影响运行. 若想禁掉这个提示,可以尝试修改文档类型为:<!DOCTYPE html>

  6. 课时16.HTML-XHTML-HTML5区别(了解)

    简而言之 HTML语法非常宽松容错性强: XHTML更为严格,它要求标签必须小写,必须严格闭合,标签中的属性必须使用引号引起等等. HTML5是HTML的下一个版本所以除了非常宽松容错性强以外,还增加 ...

  7. Servlet HttpRequest 中【getAttribute】和【getParameter】的区别

    1.获取的值不同 getAttribute表示从request范围取得设置的属性,必须要通过setAttribute设置属性,才能通过getAttribute取得.设置和取得的值都是Object类型. ...

  8. STM8 输出比较极性

    PWM输出的信号极性有两个选项决定,一个选项是PWM模式,另一个选项是输出极性控制位. 请看定时器的框图,PWM模式的选择决定OC1REF的极性, 例如当选择PWM1模式时,OC1REF信号是&quo ...

  9. android stadio mapping文件的使用

    mapping文件就是在对代码混淆以后,你用来查看混淆前和混淆后的对比文件. 一般用来查看线上的bug; java.lang.NullPointerException: Attempt to invo ...

  10. 教你一步学会安装Hue

    一.简介 hue是一个开源的apache hadoop ui系统,由cloudear desktop演化而来,最后cloudera公司将其贡献给了apache基金会的hadoop社区,它基于pytho ...