题目

大概理解一下这个图是\(n\)个点\(n\)条边的有向图,也就是一个基环内向树森林

考虑一下一个大小为\(S\)的简单环怎么做

画画图就知道,随便找个点顺着打过去,最少可以让\(\left \lceil \frac{S}{2}\right \rceil\)个人死;在一个点死之前让它去开一枪,最多可以让\(S-1\)个人死

再来考虑一下套在环上的树

首先这些树上有一些入度为\(0\)的节点,显然这些节点不可能被打死,于是考虑先这些点

最小化死亡人数,考虑到这些入度为\(0\)的点一定要打死人,不如先打死那些被入度为\(0\)的点瞄准的人,这样这些人就不能开枪了。所以我们直接按照拓扑序开枪就好了。具体做法就是让一个活着的人去开枪,之后删掉被打死的人的出边,如果产生入度为\(0\)的点那么就说明这个点能活下来,就把他加进队列。

这样我们就会搞到环上去,发现一旦我们打死了一个环上的人,那么这个环就会被破坏,按照上面的做法我们就能把这个环处理完。如果一个环的所有点都没有被其子树内的点打死,那么我们就利用上面的结论,环上的死亡人数就是\(\left \lceil \frac{S}{2}\right \rceil\)

最大化死亡人数相对好做一下,我们发现对于一棵树来说只有入度为\(0\)的点才能活,这样我们就能把状态推到环上去,如果这个环上一旦有一个点被子树里的点射死(其实就是有子树),那么这个环上所有点都能被死。否则死亡人数就是\(S-1\)

代码

#include<bits/stdc++.h>
#define re register
#define LL long long
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
inline int read() {char c=getchar();int x=0;while(c<'0'||c>'9') c=getchar();while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+c-48,c=getchar();return x;
}
const int maxn=1e6+5;
int n,tot,q[maxn],ans;
int atk[maxn],in[maxn],vis[maxn],d[maxn];
inline void del(int x) {in[atk[x]]--;if(!in[atk[x]]) q[++tot]=atk[x];}
int find(int x) {if(vis[x]) return 0;vis[x]=1;return find(atk[x])+1;
}
int main() {n=read();for(re int i=1;i<=n;i++) atk[i]=read(),in[atk[i]]++;for(re int i=1;i<=n;i++) if(!in[i]) q[++tot]=i;for(re int i=1;i<=tot;i++) {int x=q[i];if(d[atk[x]]) continue;d[atk[x]]=1;del(atk[x]);}for(re int i=1;i<=n;i++) ans+=(d[i]==1);for(re int i=1;i<=n;i++) if(in[i]&&!d[i]&&!vis[i]) {int now=find(i);ans+=(now==1?1:ceil((double)now/2));}printf("%d ",ans);memset(in,0,sizeof(in));memset(d,0,sizeof(d));memset(vis,0,sizeof(vis));ans=0;tot=0;for(re int i=1;i<=n;i++) in[atk[i]]++;for(re int i=1;i<=n;i++) if(!in[i]) q[++ans]=i;tot=ans;for(re int i=1;i<=tot;i++) {int x=q[i];if(d[atk[x]]) continue;d[atk[x]]=1;q[++tot]=atk[x];}for(re int i=1;i<=n;i++)if(!d[i]&&in[i]&&!vis[i]) {int now=find(i);ans+=(now==1?0:1);}printf("%d\n",n-ans);return 0;
}

转载于:https://www.cnblogs.com/asuldb/p/11536100.html

[POI2008]MAF-Mafia相关推荐

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

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

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

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

  3. [POI2008]枪战Maf

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

  4. 【BZOJ1124】Mafia(POI2008)-环套树DP

    测试地址:Mafia 做法: 本题需要用到环套树DP. 按照题目构图,很显然是我们很熟悉的环套树森林.接下来我们进行分析,最后活下来一些什么人是合法的呢?观察发现,一个人的目标如果是自己那就必死,而没 ...

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

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

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

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

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

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

  8. Annovar注释的突变文件转MAF对象

    maftools可以读入Annovar注释的突变文件,生成成MAF对象,方便下游的突变分析. 1. 合并不同样本的突变文件,加上样本编号 原始的vcf文件经过Annovar软件注释后会生成注释好的.v ...

  9. bzoj1131[POI2008]Sta*

    bzoj1131[POI2008]Sta 题意: 给出一个n个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大.n≤1000000. 题解: 两次dfs.第一次dfs维护子树的大小.节点 ...

  10. 洛谷 P3469 [POI2008]BLO-Blockade (Tarjan,割点)

    P3469 [POI2008]BLO-Blockade https://www.luogu.org/problem/P3469 题目描述 There are exactly nn towns in B ...

最新文章

  1. DL之GCN:GCN算法的简介(论文介绍)、架构详解、案例应用等配图集合之详细攻略
  2. 02-C#入门(循环)
  3. linux grep命令参数及用法详解---linux管道命令grep
  4. 致敬百年南开!南开大学作译者30本必读经典著作
  5. CoralCache:一个提高微服务可用性的中间件
  6. ASP.NET读取自定义的config文件
  7. Fiddler-本机抓包模拟器
  8. 六种电平转换的优缺点
  9. 微信强制性诱导分享php,微信公众号运营者注意了,下面这些诱导分享到朋友圈都是不可以的...
  10. 微信小程序setData修改数组某一项的值
  11. c语言fabs函数的返回值,fabs()函数
  12. 第七届ArcGIS暨ERDAS用户大会
  13. 禅道CMS 11.6漏洞
  14. php 时间戳与日期的转换
  15. 【MySQL】唯一性约束【UNIQUE】从基础到就业
  16. MySQL 安全方案设计
  17. python 谱聚类
  18. 在线聊天 java_java写在线聊天
  19. CSS第九天学习总结—— favicon 图标、SEO优化、logo SEO优化
  20. 计算机教育部第四轮学科评估,第四轮学科评估结果发布,学科获评A+的都在这里...

热门文章

  1. 怎样提高自己的分析能力
  2. 力扣LeetBook<链表>学习笔记
  3. 苹果手机打电话没有声音怎么回事_网页看视频没有声音怎么回事?
  4. 在Ubuntu安装Deepin软件
  5. 【汇编】微机原理与接口技术课程设计
  6. Javascript技巧(230个)[转载]
  7. GTD时间管理---学习笔记(一)
  8. 【正点原子FPGA连载】第一章 ZYNQ简介 -摘自【正点原子】领航者ZYNQ之FPGA开发指南_V2.0
  9. 在proteus中的排阻的查找_PROTEUS中这个排阻怎么找到?
  10. 考研 | 组成原理【第二章】数据的表示和运算