[POI2008]枪战Maf

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 741  Solved: 295
[Submit][Status][Discuss]

Description

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

Input

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

Output

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

Sample Input

8
2 3 2 2 6 7 8 5

Sample Output

3 5

HINT

  1 #include <queue>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <iostream>
  5 #include <algorithm>
  6 #define N 1000100
  7 using namespace std;
  8 int n,cnt;
  9 int a[N];
 10 int du[N];
 11 int head[N];
 12 int vis[N];
 13 int v[N];
 14 int fir[N];
 15 struct node
 16 {
 17     int from,to,next;
 18 }edge[N<<1];
 19 int belong[N];
 20 int cnt_du[N];
 21 int siz[N];
 22 int tot;
 23 void init()
 24 {
 25     memset(head,-1,sizeof(head));
 26     cnt=1;
 27 }
 28 void edgeadd(int from,int to)
 29 {
 30     edge[cnt].from=from,edge[cnt].to=to,edge[cnt].next=head[from];
 31     head[from]=cnt++;
 32 }
 33 void dfs(int now,int ff)
 34 {
 35     vis[now]=1,belong[now]=tot,siz[tot]++;
 36     for(int i=head[now];i!=-1;i=edge[i].next)
 37     {
 38         int to=edge[i].to;
 39         if(to==now||to==ff||vis[to])continue;
 40         dfs(to,now);
 41     }
 42 }
 43 int check(int now,int num)
 44 {
 45     v[now]=1;
 46     int t=now,cntt=1;
 47     while(!v[a[t]])
 48     {
 49         v[a[t]]=1;
 50         t=a[t];
 51         cntt++;
 52     }
 53     t=a[t];
 54     if(t==now&&cntt==num)return 1;
 55     return 0;
 56 }
 57 int main()
 58 {
 59     init();
 60     scanf("%d",&n);
 61     for(int i=1;i<=n;i++)
 62     {
 63         scanf("%d",&a[i]);
 64         du[a[i]]++;
 65         edgeadd(i,a[i]);
 66         edgeadd(a[i],i);
 67     }
 68     for(int i=1;i<=n;i++)
 69     {
 70         if(!vis[i])
 71             tot++,dfs(i,0),fir[tot]=i;
 72     }
 73     for(int i=1;i<=n;i++)
 74     {
 75         if(du[i]==0)cnt_du[belong[i]]++;
 76     }
 77     int ansma=0,ansmi=0;
 78     for(int i=1;i<=tot;i++)
 79     {
 80         if(siz[i]==1)ansma++;
 81         if(check(fir[i],siz[i]))
 82             ansma+=siz[i]-1;
 83         else ansma+=siz[i]-cnt_du[i];
 84     }
 85     memset(v,0,sizeof(v));
 86     memset(vis,0,sizeof(vis));
 87     queue<int>q;
 88     for(int i=1;i<=n;i++)
 89     {
 90         if(!du[i])
 91             q.push(i);
 92     }
 93     while(!q.empty())
 94     {
 95         int u=q.front();
 96         q.pop();
 97         v[u]=1;
 98         if(!vis[a[u]])
 99         {
100             v[a[u]]=vis[a[u]]=1,ansmi++;
101             du[a[a[u]]]--;
102             if(!du[a[a[u]]])
103                 q.push(a[a[u]]);
104         }
105     }
106     for(int i=1;i<=n;i++)
107     {
108         if(!v[i])
109         {
110             int t=i,cnt=0;
111             while(!v[t])
112             {
113                 v[t]=1;
114                 cnt++;
115                 t=a[t];
116             }
117             ansmi+=(cnt+1)/2;
118         }
119     }
120     printf("%d %d\n",ansmi,ansma);
121 }

转载于:https://www.cnblogs.com/fengzhiyuan/p/8682172.html

bzoj 1124 [POI2008]枪战Maf 贪心相关推荐

  1. BZOJ 1124 [POI2008]枪战Maf 贪心+乱搞

    题意:略. 方法:贪心+乱搞. 解析: 今天做的题里面最难的了- 分连通块进行考虑. 一个连通块最多死多少呢? 一个点 -> 死一个 一个环 -> 死环上点个数-1个 一个环加上内向树 - ...

  2. bzoj 1124: [POI2008]枪战Maf(贪心)

    1124: [POI2008]枪战Maf Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 713  Solved: 278 [Submit][Stat ...

  3. BZOJ 1124: [POI2008]枪战Maf(构造 + 贪心)

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

  4. [POI2008]枪战Maf

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

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

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

  6. BZOJ.1178.[APIO2009]会议中心(贪心 倍增)

    BZOJ 洛谷 \(Description\) 给定\(n\)个区间\([L_i,R_i]\),要选出尽量多的区间,并满足它们互不相交.求最多能选出多少个的区间以及字典序最小的方案. \(n\leq2 ...

  7. [BZOJ 1112] [POI2008] 砖块Klo 【区间K大】

    题目链接:BZOJ - 1112 题目分析 枚举每一个长度为k的连续区间,求出这个区间的最优答案,更新全局答案. 可以发现,这个区间的所有柱子最终都变成这k个数的中位数时最优,那么我们就需要查询这个区 ...

  8. bzoj 1045 [HAOI2008] 糖果传递 —— 贪心

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1045 好像是贪心...但这是一个环... 看博客:http://hzwer.com/2656 ...

  9. BZOJ 1113: [Poi2008]海报PLA

    1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1025  Solved: 679 [Submit][Sta ...

最新文章

  1. 测试用例设计方法-错误推测法
  2. java之父求职_Java求职实战之继承和多态
  3. 【深度思考】javaweb框架技术心得
  4. 如何阻止SAP CRM订单创建好之后,自动被置为传输状态这一行为
  5. mongodb 输出数组字段_MongoDb文档操作、索引操作
  6. 【android-音视频】listview中播放音频,实现音频时长的倒计时,暂停,切换。
  7. java中的数据结构——图
  8. php+mysql+记账系统_做了个php+mysql简单记账系统
  9. List map 转 list对象
  10. 【Python+Stata】豪斯曼检验:固定效应or随机效应?
  11. Elasticsearch:如何在聚合时选择所需要的 bucket 并进行可视化
  12. css-图片闪烁效果
  13. 旧约圣经对基督(弥赛亚)的预言
  14. 如何打造零信任时代的身份管理系统?
  15. 笔记本电脑无法进入睡眠状态_电脑进入睡眠模式后无法唤醒的原因解析
  16. html字体插件,20款jQuery CSS文字特效插件(有图有真相)
  17. 《矩阵理论》大萌课程笔记 - 特殊矩阵
  18. vue 项目 下载模板和导入模板
  19. 保姆式做启动盘,装win10专业系统,系统盘机械盘分区,下载网卡、主板等驱动
  20. comfast wireless usb adapter 配置手记

热门文章

  1. python存储和读取数据时出现错误_python读取json文件存sql及codecs读取大文件问题...
  2. indesign如何画弧线_彩铅画入门教程,如何给独角兽设计一款好发型
  3. 5菜鸟教程_excel图文教程:应用PQ工具进行数据整理
  4. html快速排序,快速排序.html
  5. git 更新_[技术分享T.191212]GitLab使用方法及git命令常见问题(不断更新)
  6. python epoll多路复用技术_python IO 多路复用 epoll简单模型
  7. 使用eclipse调试ns3配置说明
  8. 什么是四路串口服务器?
  9. 【渝粤教育】国家开放大学2019年春季 1124流行病学 参考试题
  10. [渝粤教育] 中国地质大学 大学英语(6) 复习题