枪战(maf)
枪战(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)的更多相关文章
- BZOJ 1124: [POI2008]枪战Maf
1124: [POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 617 Solved: 236[Submit][Status ...
- [POI2008]枪战Maf
[POI2008]枪战Maf 题目 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的 ...
- [BZOJ 1124][POI 2008] 枪战 Maf
1124: [POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 659 Solved: 259[Submit][Status ...
- bzoj 1124 [POI2008]枪战Maf 贪心
[POI2008]枪战Maf Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 741 Solved: 295[Submit][Status][Disc ...
- 【BZOJ1124】[POI2008]枪战Maf 贪心+思路题
[BZOJ1124][POI2008]枪战Maf Description 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开 ...
- [POI2008]枪战Maf题解
问题 C: [POI2008]枪战Maf 时间限制: 1 Sec 内存限制: 256 MB 题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺 ...
- BZOJ1124 [POI2008]枪战Maf[贪心(证明未完成)+拓扑排序]
吐槽:扣了几个小时,大致思路是有了,但是贪心的证明就是不会, 死磕了很长时间,不想想了,结果码代码又不会码.. 深深体会到自己码力很差,写很多行还没写对,最后别人代码全一二十行,要哭了 以下可能是个人 ...
- 枪战Maf[POI2008]
题目描述 有n个人,每个人手里有一把手枪.一开始所有人都选定一个人瞄准(有可能瞄准自己).然后他们按某个顺序开枪,且任意时刻只有一个人开枪.因此,对于不同的开枪顺序,最后死的人也不同. 输入 输入n人 ...
- bzoj1124[POI2008]枪战maf
这代码快写死我了.....死人最多随便推推结论.死人最少,每个环可以单独考虑,每个环上挂着的每棵树也可以分别考虑.tarjan找出所有环,对环上每个点,求出选它和不选它时以它为根的树的最大独立集(就是 ...
- 【BZOJ】1124: [POI2008]枪战Maf
题意 \(n(n < 1000000)\)个人,每个人\(i\)指向一个人\(p_i\),如果轮到\(i\)了且他没死,则他会将\(p_i\)打死.求一种顺序,问死的人最少和最多的数目. 分析 ...
随机推荐
- tp3.2 excel导出
//导出操作 function exportExcel($expTitle,$expCellName,$expTableData,$names,$width){ $xlsTitle = iconv(' ...
- 《Linux就该这么学》,刘小伙实在人,给打个广告
本书是由全国多名红帽架构师(RHCA)基于最新Linux系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材,目前是国内最值得去读的Linux教材,也是最有价值 ...
- array_unique() - 去除数组中重复的元素值
array_unique() 定义和用法 array_unique() 函数移除数组中的重复的值,并返回结果数组. 当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除. 返回的数组中键名 ...
- 深度CNN
[具体参考可以看这里(https://cloud.tencent.com/developer/article/1369425)
- Hive数据导入导出的n种方式
Tutorial-LoadingData Hive加载数据的6种方式 #格式 load data [local] inpath '/op/datas/xxx.txt' [overwrite] into ...
- Android Kotlin 连接 http
由于近期网上搜索了很多Android连接到http的方法, 可是2013年以前的方法现在都不能用了,要么报错,要么被遗弃,岁月留下来的东西只能自己整理了. 其实很简单,就一个HttpUtil通用类.可 ...
- 支付宝sdk 支付订单查询失败
最近遇到了一些问题,厂商给我们反馈了一个问题,就是支付宝支付成功之后,旋转屏幕,订单查询失败.后来我怀疑是支付宝的问题,想都不用想是支付宝的问题. 但是自己根本你无法复现,因为我发现支付宝支付完成之后 ...
- android 事件拦截 (Viewpager不可以左右滑动)
以前没有做过真正的需求,所以从来没有觉得事件拦截分发处理有什么好懂的. 现在做需求了,真的是什么需求都有,你作为开发都要去研究实现.比如说,只能点不能滑动的viewpager.其实这都可以不用view ...
- 线程间通信(等待,唤醒)&Java中sleep()和wait()比较
1.什么是线程间通信? 多个线程在处理同一资源,但是任务却不同. 生活中栗子:有一堆煤,有2辆车往里面送煤,有2辆车往外拉煤,这个煤就是同一资源,送煤和拉煤就是任务不同. 2.等待/唤醒机制. 涉及的 ...
- 使用Eclipse把java文件打包成jar
本例仅限于要打包的文件没有使用第三方的jar包 在要打包的包或者文件上右键-Export 这里有一些选项: Export generated class files and resources 表示只 ...