【BZOJ1124】[POI2008]枪战Maf

Description

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

Input

输入n人数<1000000 每个人的aim

Output

你要求最后死亡数目的最小和最大可能

Sample Input

8
2 3 2 2 6 7 8 5

Sample Output

3 5

题解:最大:首先入度为0的点一定不会死;另外,如果一个连通块只由一个环组成,那么环中一定有一个人能活下来;但是如果这个环是自环,那么这个人还是得死。

最小:首先入度为0的点一定不会死,那么让他们先开枪,将他们指向的人打死,然后又会出现一些新的入度为0的点,继续做下去即可。最后有一些点没有搜到,那么这些点一定是若干个环,每个环中最少死的人数显然是(siz+1)/2。

#include <cstdio>
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
const int maxn=1000010;
int n,m,a1,a2,s1,s2,len,sl;
int to[maxn],f[maxn],siz[maxn],d[maxn];
int r[maxn],vis[maxn];
queue<int> q;
int find(int x)
{
return (f[x]==x)?x:(f[x]=find(f[x]));
}
inline int rd()
{
int ret=0,f=1; char gc=getchar();
while(gc<'0'||gc>'9') {if(gc=='-')f=-f; gc=getchar();}
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret*f;
}
int main()
{
n=rd();
int i,u,v,a;
for(i=1;i<=n;i++) f[i]=i,siz[i]=1;
for(i=1;i<=n;i++)
{
a=rd(),d[a]++,to[i]=a;
if(find(a)!=find(i)) siz[f[a]]+=siz[f[i]],f[f[i]]=f[a];
else r[++m]=i;
}
for(a1=n,i=1;i<=n;i++) if(!d[i]) q.push(i),a1--;
for(i=1;i<=m;i++)
{
a=find(r[i]);
for(u=to[r[i]],len=1;u!=r[i];u=to[u],len++);
if(siz[a]!=1&&len==siz[a]) a1--;
}
while(!q.empty())
{
u=q.front(),v=to[u],q.pop(),siz[find(u)]--;
if(!vis[v])
{
a2++,vis[v]=1,d[to[v]]--,siz[find(v)]--;
if(!vis[to[v]]&&!d[to[v]]) q.push(to[v]);
}
}
for(i=1;i<=n;i++) if(find(i)==i) a2+=(siz[i]+1)/2;
printf("%d %d\n",a2,a1);
return 0;
}

最新文章

  1. 理解CSV文件以及ABAP中的相关操作
  2. mongoTemplate简单用法(增删改查)
  3. Struts1与Struts2的异同
  4. 对Jsp提交input标签空格和回车的处理
  5. Live Writer Test
  6. SpringBoot ( 七 ) :springboot + mybatis 多数据源最简解决方案
  7. CCF系列之数字排序(201503-2)
  8. Javascript高级编程学习笔记(66)—— 事件(10)变动事件
  9. 有序列表ol,无序列表ul,定义列表dl
  10. Appium之开发计算器自动化测试脚本Demo
  11. 【blog】MarkDown语法解析为HTML工具
  12. 51 NOd 2006 飞行员配对(匈牙利算法二分匹配)
  13. Spark项目之电商用户行为分析大数据平台之(四)离线数据采集
  14. STL_算法_中使用的函数对象
  15. 几个原生js方法总结
  16. GitHub上如何删除repository仓库
  17. linux下导入、导出mysql 数据库命令
  18. Mvn+Jetty启动项目
  19. 原生JS实现返回顶部和滚动锚点
  20. TDiocpCoderTcpServer返回数据记录有条数限制的问题

热门文章

  1. AC日记——琪露诺 洛谷 P1725
  2. 玲珑杯 Round #5 Problem E Tetration (枚举 + 欧拉公式)
  3. [Machine Learning with Python] My First Data Preprocessing Pipeline with Titanic Dataset
  4. POJ 1067 取石子游戏 [博弈]
  5. [JLOI2015]有意义的字符串
  6. (入门SpringBoot)SpringBoot结合拦截器(七)
  7. 模型搭建练习1_用numpy和tensor、variable实现前后向传播、实现激活函数
  8. 小菜的系统框架界面设计-XiaoCai.WinformUI代码开源
  9. Learn How To Create Trigger In Oracle Forms
  10. HDU1421