我对贪心的理解:https://www.cnblogs.com/AKMer/p/9776293.html

题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=1217

显然对于树最下面那一层点,肯定都会被父亲上或者祖父上的消防局管理。我们就可以从深度最深的点开始贪心。我们把点按深度从大到小排序,对于当前点如果没有被父亲、祖父、儿子、孙子、兄弟上的消防局管理就应该在这个点的祖父处新建一个消防局,这样显然可以管理更多点。父亲和祖父上有没有消防局很容易判断,儿子和孙子上有没有消防局我们可以在儿子或孙子上建消防局的时候更新父亲或祖父的信息来判断。那么兄弟咋整呢?暴力去枚举的话显然不行。

所以我们开一个数组\(dis\)记录某些神奇的信息。\(dis[i]\)表示到\(i\)号点最近的消防局距离是多少。初始都为\(n\)。每次新建一个消防局都去更新这个点的父亲和祖父的\(dis\),因为比这个点深度更深的显然已经不需要更新了。每次判断兄弟上有没有消防局只需要判断父亲的\(dis\)是不是等于\(1\)就行了。

时间复杂度:\(O(nlogn)\)

空间复杂度:\(O(n)\)

代码如下:

#include <cstdio>
#include <algorithm>
using namespace std; int n,ans;
int fa[1005],dep[1005],dis[1005],id[1005]; int read() {
int x=0,f=1;char ch=getchar();
for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
return x*f;
} bool cmp(int a,int b) {
return dep[a]>dep[b];
} int main() {
n=read();
for(int i=2;i<=n;i++) {
id[i]=i,fa[i]=read();
dep[i]=dep[fa[i]]+1,dis[i]=n;
}id[1]=1;dis[1]=dis[0]=n;
sort(id+1,id+n+1,cmp);//按深度排序
for(int i=1;i<=n;i++) {
int u=id[i],f=fa[u],ff=fa[f];
dis[u]=min(dis[u],min(dis[f]+1,dis[ff]+2));//用兄弟或者祖父来跟新自己的dis
if(dis[u]>2) {//如果当前点无人管理,那就在祖父处新建消防局
dis[ff]=0;ans++;int fff=fa[ff],ffff=fa[fff];
dis[fff]=min(dis[fff],1);
dis[ffff]=min(dis[ffff],2);//在祖父的父亲和祖父处更新dis信息
}
}
printf("%d\n",ans);
return 0;
}

BZOJ1217:[HNOI2003]消防局的设立的更多相关文章

  1. BZOJ1217: [HNOI2003]消防局的设立

    BZOJ1217: [HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地. 起初为了节约材料,人类只修建了n-1条道路来连接这些基地 ...

  2. bzoj1217: [HNOI2003]消防局的设立 [树形dp]

    Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...

  3. 【BZOJ1217】[HNOI2003]消防局的设立 树形DP

    [BZOJ1217][HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地, ...

  4. BZOJ 1217: [HNOI2003]消防局的设立( 贪心 )

    一个简单的贪心, 我们只要考虑2个消防局设立的距离为5时是最好的, 因为利用最充分. 就dfs一遍, 再对根处理一下就可以了. 这道题应该是SGU某道题的简化版...这道题距离只有2, 树型dp应该也 ...

  5. P2279 [HNOI2003]消防局的设立

    P2279 [HNOI2003]消防局的设立考场上想出了贪心策略,但是处理细节时有点问题,gg了.从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上. #inc ...

  6. [HNOI2003]消防局的设立 (贪心)

    [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达, ...

  7. [luogu]P2279 [HNOI2003]消防局的设立[贪心]

    [luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两 ...

  8. 【洛谷P2279】[HNOI2003]消防局的设立

    消防局的设立 题目链接 贪心:每次取出深度最大的节点,若没有被覆盖到,要想覆盖它, 最优的做法显然是将它的爷爷设为消防局 (因为该节点深度为最大,选兄弟.父亲所覆盖的节点,选了爷爷后都能够覆盖) 用优 ...

  9. BZOJ1217或洛谷2279 [HNOI2003]消防局的设立

    BZOJ原题链接 洛谷原题链接 该题有两种做法,树形\(DP\)和贪心. 先讲贪心. 先将所有点按深度从大到小排序,然后从大到小依次取出点,若已经被覆盖则跳过,否则就在它的祖父点建立消防站. 考虑如何 ...

随机推荐

  1. 如何实现模拟器(CHIP-8 interpreter) 绝佳杰作.

    转自 http://www.multigesture.net/articles/how-to-write-an-emulator-chip-8-interpreter/ How to write an ...

  2. java操作文件流对象

    所有流对象 InputStream 字节流         FileInputStream 字节流 专门读写非文本文件的         BufferedInputStream 高效流 OutPutS ...

  3. WCF基础之序列化

    wcf是基于消息进行通信的,这篇就是简单说下序列化引擎是如何将.net object转化为xml消息.一般情况下很少用到这些,你只需定义数据协定之类的或者指定相应的序列化引擎,然后设置相应的特性就好. ...

  4. iOS和Android后台机制对比

    转自:http://blog.csdn.net/zsch591488385/article/details/27232881 一.iOS的“伪后台”程序 首先,先了解一下ios 中所谓的「后台进程」到 ...

  5. 17.Django表单验证

    Django提供了3中方式来验证表单 官网文档:https://docs.djangoproject.com/en/1.9/ref/validators 1.表单字段验证器 a.引入:from dja ...

  6. hibernate 多对多 懒加载问题

    报错:org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: net. ...

  7. java上传文件,下载文件

    1.上传文件 1 protected int doTask(BaseForm form) throws AppException, FatalException, NoExistsException, ...

  8. Shell中的while循环

    while循环的格式   while expression do command command ``` done 1.计数器控制的while循环    主要用于已经准确知道要输入的数据和字符串的数目 ...

  9. 禁用chrome浏览器的cookie

    Chrome: 1.打开chrome浏览器,点击右上角的“自定义和控制Google Chrome”按钮 2.在下拉菜单中选择设置 3.点击设置页底部的“显示高级设置...” 4.在隐私设置下,点击“内 ...

  10. JSON for java

    一.JSON介绍 JSON(JavaScript Object Notation),类似于XML,是一种数据交换格式,比如Java产生了一个数据想要给JavaScript,则除了利用XML外,还可以利 ...