[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<<];
  19. int belong[N];
  20. int cnt_du[N];
  21. int siz[N];
  22. int tot;
  23. void init()
  24. {
  25. memset(head,-,sizeof(head));
  26. cnt=;
  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]=,belong[now]=tot,siz[tot]++;
  36. for(int i=head[now];i!=-;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]=;
  46. int t=now,cntt=;
  47. while(!v[a[t]])
  48. {
  49. v[a[t]]=;
  50. t=a[t];
  51. cntt++;
  52. }
  53. t=a[t];
  54. if(t==now&&cntt==num)return ;
  55. return ;
  56. }
  57. int main()
  58. {
  59. init();
  60. scanf("%d",&n);
  61. for(int i=;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=;i<=n;i++)
  69. {
  70. if(!vis[i])
  71. tot++,dfs(i,),fir[tot]=i;
  72. }
  73. for(int i=;i<=n;i++)
  74. {
  75. if(du[i]==)cnt_du[belong[i]]++;
  76. }
  77. int ansma=,ansmi=;
  78. for(int i=;i<=tot;i++)
  79. {
  80. if(siz[i]==)ansma++;
  81. if(check(fir[i],siz[i]))
  82. ansma+=siz[i]-;
  83. else ansma+=siz[i]-cnt_du[i];
  84. }
  85. memset(v,,sizeof(v));
  86. memset(vis,,sizeof(vis));
  87. queue<int>q;
  88. for(int i=;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]=;
  98. if(!vis[a[u]])
  99. {
  100. v[a[u]]=vis[a[u]]=,ansmi++;
  101. du[a[a[u]]]--;
  102. if(!du[a[a[u]]])
  103. q.push(a[a[u]]);
  104. }
  105. }
  106. for(int i=;i<=n;i++)
  107. {
  108. if(!v[i])
  109. {
  110. int t=i,cnt=;
  111. while(!v[t])
  112. {
  113. v[t]=;
  114. cnt++;
  115. t=a[t];
  116. }
  117. ansmi+=(cnt+)/;
  118. }
  119. }
  120. printf("%d %d\n",ansmi,ansma);
  121. }

bzoj 1124 [POI2008]枪战Maf 贪心的更多相关文章

  1. BZOJ 1124: [POI2008]枪战Maf

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

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

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

  3. 【刷题】BZOJ 1124 [POI2008]枪战Maf

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

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

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

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

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

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

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

  7. [POI2008]枪战Maf题解

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

  8. [POI2008]枪战Maf

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

  9. 【BZOJ 1124】[POI2008] 枪战Maf Tarjan+树dp

    #define int long long using namespace std; signed main(){ 这个题一看就是图论题,然后我们观察他的性质,因为一个图论题如果没有什么性质,就是真· ...

随机推荐

  1. Excel学习路径总结

    本片涉及从入门到Excel的各个方向,包含众多资料和自己学习的心得,希望您可以仔细阅之:   入门篇: 无论是软件,还是编程,最好的入门就是通过看视频来学习,视频优点为很容易看清楚,手把手教授,不容易 ...

  2. nyoj 525 一道水题【字符串(分割)】

    参考:https://blog.csdn.net/dxx_111/article/details/48154687 #include <iostream> #include <cst ...

  3. TRANSLATE(转换大/小写并替换字符)

    可以将字母 转换大/小 写或使用替 换规则. 要转换大/小 写,请使用 TRANSLATE 语句,用法 如下: 语法 TRANSLATE <c> TO UPPER CASE. TRANSL ...

  4. Sphinx与coreseek

    Sphinx : 高性能SQL全文检索引擎 分类 编程技术 Sphinx是一款基于SQL的高性能全文检索引擎,Sphinx的性能在众多全文检索引擎中也是数一数二的,利用Sphinx,我们可以完成比数据 ...

  5. What to do when Enterprise Manager is not able to connect to the database instance (ORA-28001)

    摘自:http://dbtricks.com/?p=34 If you are trying to connect to the Oracle enterprise Manger and you ge ...

  6. Kotlin 1 函数

    #2 函数 函数声明和平时我见到的有点不太一样,使用关键字fun来声明.(感觉好欢乐的样子···O(∩_∩)O~~) 下面的示例,简单的声明了一个函数: // 这是函数声明 fun this_is_a ...

  7. Ngix配置,让所有请求指向同一个文件

    统一入口使所有请求在同一个文件先验证处理,Ngix添加如下代码: location / { try_files '' /index.php; }

  8. MySQL☞create语句

    几种常用的建表语句: 1.最简单的建表语句: create table 表名( 列名1 数据类型(长度), 列名2 数据类型(长度), ... ) 2.带主键的建表语句: CREATE TABLE 表 ...

  9. MySQL linux错误处理

    https://cloud.tencent.com/developer/article/1023732 mysql5.7 ERROR 1045 (28000): Access denied for u ...

  10. [leetcode-655-Print Binary Tree]

    Print a binary tree in an m*n 2D string array following these rules: The row number m should be equa ...