吐槽:扣了几个小时,大致思路是有了,但是贪心的证明就是不会,

死磕了很长时间,不想想了,结果码代码又不会码。。

深深体会到自己码力很差,写很多行还没写对,最后别人代码全一二十行,要哭了


以下可能是个人口胡瞎扯:首先n个点,每个点一个出边,所以这个图可能是有很多连通块,具体有以下几种形态:

  • 内向基环树
  • 树上有一个点套一个自环

这三种构成森林。

先看最多死多少人。

  • 环的话是$siz-1$
  • 内向基环树只有树那部分的叶子(无入度)可以存活。画图举例辅助理解。
  • 树上带自环:同上

再看很烦人的最少死多少人

  • 环:$ \lfloor \frac{n+1}{2} \rfloor$
  • 内向基环树:拓扑排序,将入度为0的全加队里,一直这样处理,把死掉的点和开过枪的点删掉。
  • 树带自环:同上

然后拓扑处理后上面三种形态的变化情况:

  • 环:不变
  • 内向基环树:可能剩下一个环,或者因为被破坏而啥都不剩
  • 树:可能剩下一个自环或无

然后至于为什么要做拓扑排序,这是一个贪心,我没有办法严谨证明。。哭。

首先对于树,肯定是从叶子开始把父亲全杀死,然后父亲的父亲是活的,继续向上开枪......这样比其他顺序是更优的。

环的话也同理。而内向基环树我就不会证了。如果环上挂一个树,可以发现树根杀不杀死环上的点对于环上的点答案是无影响的。

所以只看树的部分,也就是拓排。那一个环上挂很多个树呢?这辈子我一定会把他证出来的。

总之就是先拓扑排序附带统计ans,然后只会剩下环和自环,然后再在这些环里处理答案。

其实code我是厚颜无耻抄的。。自己写的实在搞不下去了。。今年破格抄一次code,到年尾再也不抄了

付下这位神仙的题解:BZOJ1124: [POI2008]枪战Maf。感谢指导。侵删。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#define dbg(x) cerr << #x << " = " << x <<endl
using namespace std;
typedef long long ll;
typedef double db;
typedef pair<int,int> pii;
template<typename T>inline T _min(T A,T B){return A<B?A:B;}
template<typename T>inline T _max(T A,T B){return A>B?A:B;}
template<typename T>inline char MIN(T&A,T B){return A>B?(A=B,):;}
template<typename T>inline char MAX(T&A,T B){return A<B?(A=B,):;}
template<typename T>inline void _swap(T&A,T&B){A^=B^=A^=B;}
template<typename T>inline T read(T&x){
x=;int f=;char c;while(!isdigit(c=getchar()))if(c=='-')f=;
while(isdigit(c))x=x*+(c&),c=getchar();return f?x=-x:x;
}
const int N=1e6+;
int to[N],ind[N];
int n,maxlive,minlive;
int q[N],dead[N],cir[N]; int main(){//freopen("test.in","r",stdin);//freopen("test.out","w",stdout);
read(n);
for(register int i=;i<=n;++i)read(to[i]),++ind[to[i]];
for(register int i=;i<=n;++i)if(!ind[i])++minlive,q[++maxlive]=i;
for(register int l=;l<=maxlive;++l){
int y=to[q[l]];
if(dead[y])continue;
dead[y]=,cir[to[y]]=;
if(!(--ind[to[y]]))q[++maxlive]=to[y];
}
for(register int i=;i<=n;++i)if(!dead[i]&&ind[i]){
int siz=,p=;
for(register int j=i;!dead[j];j=to[j])dead[j]=,++siz,p|=cir[j];
if(!p&&(siz>))++minlive;
maxlive+=siz/;
}
return printf("%d %d\n",n-maxlive,n-minlive),;
}

我以后会来补证明的。

人类的本质是鸽子

BZOJ1124 [POI2008]枪战Maf[贪心(证明未完成)+拓扑排序]的更多相关文章

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

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

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

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

  3. BZOJ1124 POI2008枪战Maf(环套树+贪心)

    每个点出度都为1,可以发现这张图其实是个环套树森林,树中儿子指向父亲,环上边同向. 首先自环肯定是没救的,先抬出去. 要使死亡人数最多的话,显然若一个点入度为0其不会死亡,而一个孤立的环至少会留下一个 ...

  4. bzoj1124[POI2008]枪战maf

    这代码快写死我了.....死人最多随便推推结论.死人最少,每个环可以单独考虑,每个环上挂着的每棵树也可以分别考虑.tarjan找出所有环,对环上每个点,求出选它和不选它时以它为根的树的最大独立集(就是 ...

  5. [POI2008]枪战Maf题解

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

  6. BZOJ 1124: [POI2008]枪战Maf

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

  7. [POI2008]枪战Maf

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

  8. HDU 5695 ——Gym Class——————【贪心思想,拓扑排序】

    Gym Class Time Limit: 6000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)Total S ...

  9. 【BZOJ1124】[POI2008]枪战Maf(基环树_构造)

    被教练勒令做题不能看题解后的第一道新题,自行 yy 了好久终于 AC 了(菜啊)--写博客纪念. 题目: BZOJ1124 分析: 考虑每个人向他要打的人连边.根据题意,所有点都有且只有一条出边.那么 ...

随机推荐

  1. pm2 代替 Supervisor 管理进程

    前提 我们在使用 Laravel 的时候不免用到列队来处理任务,而 Laravel 官方文档给出的是 Supervisor 来管理进程和监控.但是我们在使用中有下面几个缺点: Supervisor 单 ...

  2. Qt QLabel添加cliked事件

    #ifndef MYLABEL_H #define MYLABEL_H #include <QObject> #include <QLabel> class MyLabel : ...

  3. unzip 命令

    NAME unzip - list, test and extract compressed files in a ZIP archive SYNOPSIS unzip [-Z] [-cflptTuv ...

  4. jenkins pipline 和 jenkinsfile

    Jenkins Pipeline(或简称为 "Pipeline")是一套插件,将持续交付的实现和实施集成到 Jenkins 中.Jenkins Pipeline 提供了一套可扩展的 ...

  5. Duilib的多级菜单实现(网易云信版本)

    完整代码见:https://github.com/netease-im/NIM_Duilib_Framework/tree/master/ui_components/menu 核心代码: ui_men ...

  6. 前端开发工具包 WijmoJS 2019V1正式发布:全新的在线 Demo 系统,助您快速上手,开发无忧

    ​ 前端开发工具包WijmoJS在2019年的第一个主要版本2019V1已经发布,本次发布包括了更加易用的在线Demo系统.各控件新增功能.NPM 包的改动,以及全新的浏览器API组件. WijmoJ ...

  7. Oacle常用语句

    1.建表语句 ) NOT NULL, region_id ) NOT NULL, salesperson_id ) NOT NULL, ) NOT NULL, ) NOT NULL, tot_orde ...

  8. 常见网络摄像机的端口及RTSP地址

    海康威视默认IP地址:192.168.1.64/DHCP 用户名admin 密码自己设端口:“HTTP 端口”(默认为 80).“RTSP 端口”(默认为 554).“HTTPS 端 口”(默认 44 ...

  9. Luogu P3511 [POI2010]MOS-Bridges

    题目 二分答案然后混合图欧拉回路,因为没有SPJ所以就没写了,怕写了有锅.

  10. requests库爬取豆瓣热门国产电视剧数据并保存到本地

    首先要做的就是去豆瓣网找对应的接口,这里就不赘述了,谷歌浏览器抓包即可,然后要做的就是分析返回的json数据的结构: https://movie.douban.com/j/search_subject ...