BZOJ1217: [HNOI2003]消防局的设立
BZOJ1217: [HNOI2003]消防局的设立
Description
Input
Output
仅有一个正整数,表示至少要设立多少个消防局才有能力及时扑灭任何基地发生的火灾。
Sample Input
1
2
3
4
5
Sample Output
题解Here!
各大神犇都用的是树形$DP$。。。
不会树形$DP$的我瑟瑟发抖。。。
其实是一个贪心:找最低没被覆盖到的点,并在它的祖父处设一个消防站。
考虑到这个点的所有子孙后代都已经被覆盖了,因此这时覆盖祖父能盖到更多额外的点,并保证结果不会更差。
很多思路是用$DFS$或堆求取最低节点,实际上没必要,只要预处理出深度(边输入边处理)并排序。
然后碰到已覆盖就跳过,未覆盖就在祖父处设消防站,并且$ans++$即可。
问题在于怎样才能判断这个点覆盖到了没有。
有两种情况很好解决:
1. 儿子或孙子覆盖他:可以在在儿子处设站时就标记它。
2. 父亲或祖父覆盖他:可以用儿子对父亲的映射$fa[i]$来解决。
但是问题在于兄弟:
我们可以用$dis$数组维护$\text{离i最近的消防站到i的距离}$,当$dis[fa[i]]==1$时,就能确定它是否被覆盖。
附:
这种方法的普适性很强,可以解决半径为$k$的最小覆盖问题,而且不用存图。
这时只需要把维护$\text{父亲和爷爷}$改成维护$\text{上位k位祖先}$即可,复杂度$O(NK)$,常数也很小。
然后就可以不用想$DP$。
附代码:
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 1010
using namespace std;
int n,ans=0;
int fa[MAXN],deep[MAXN],rk[MAXN],dis[MAXN];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline bool cmp(const int &p,const int &q){return deep[p]>deep[q];
}
void work(){for(int i=1;i<=n;i++){int w=rk[i],u=fa[w],v=fa[u];dis[w]=min(dis[w],min(dis[u]+1,dis[v]+2));if(dis[w]>2){ans++;dis[v]=0;dis[fa[v]]=min(dis[fa[v]],1);dis[fa[fa[v]]]=min(dis[fa[fa[v]]],2);}}printf("%d\n",ans);
}
void init(){n=read();rk[1]=deep[1]=1;dis[1]=dis[0]=n;for(int i=2;i<=n;i++){fa[i]=read();deep[i]=deep[fa[i]]+1;rk[i]=i;dis[i]=n;}sort(rk+1,rk+n+1,cmp);
}
int main(){init();work();return 0;
}
转载于:https://www.cnblogs.com/Yangrui-Blog/p/9839708.html
BZOJ1217: [HNOI2003]消防局的设立相关推荐
- bzoj1217: [HNOI2003]消防局的设立 [树形dp]
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...
- 【bzoj1217】[HNOI2003]消防局的设立 贪心
[HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能 ...
- bzoj 1217 [HNOI2003]消防局的设立 贪心
[HNOI2003]消防局的设立 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 908 Solved: 531 [Submit][Status][ ...
- 【洛谷P2279】[HNOI2003]消防局的设立
消防局的设立 题目链接 贪心:每次取出深度最大的节点,若没有被覆盖到,要想覆盖它, 最优的做法显然是将它的爷爷设为消防局 (因为该节点深度为最大,选兄弟.父亲所覆盖的节点,选了爷爷后都能够覆盖) 用优 ...
- [HNOI2003]消防局的设立(贪心)
链接:https://ac.nowcoder.com/acm/problem/20031 来源:牛客网 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类 ...
- [Luogu2279][HNOI2003] 消防局的设立
文章目录 题目 法一:树上DP 思路 代码实现 法二:贪心 + 搜索 思路 代码实现 题目 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来 ...
- [HNOI2003] 消防局的设立
经典题,但还是想写一篇完整而又详细美观的题解. 本文含有贪心及 dp 的做法,适合所有语言人群阅读. 1Perface\Large\textbf{1 Perface}1 Perface 本题的 424 ...
- 数据埋点|从隐私保护浅谈数据生命周期,初识数据埋点
点击上方 蓝字 关注我们 你是否和我有同样的感觉,不知道从什么时候开始我们的隐私已经彻彻底底地暴露,在互联网场景下我们就是在裸奔.列举几个情景,你应该也会感同身受. 想必在某宝上搜索过自己心仪的商品后 ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
最新文章
- 中科院DeepMind联手,用深度学习揭示大脑如何识别人脸|Nature子刊
- 公共互联网网络安全突发事件应急预案_安徽新规:发生重大突发事件,官方5小时内必须发声...
- BZOJ 2208[Jsoi2010]连通数
- 第二章 Burp Suite代理和浏览器设置
- ASP.NET Core 自动检查编译项目组件配置
- poj 2263 Heavy Cargo floyd基础,就是输入的时候处理字符串纠结一点!!!!
- 127.自己开发一个 PHP 框架
- php获取跨域json数据,PHP使用ajax跨域获取json数据的两种方法
- 如何从PDF文件中提取几页为一个PDF文件?
- java实现计算器功能_用java实现计算器功能
- 如何使用Apollo / Graphene管理GraphQL突变中的文件上传
- java for步长_Velocity模板循环支持自定义步长
- R语言入门(2)时间序列分析原理
- 去除数字的正则表达式
- git 本地回退到某个版本
- js设计模式——组合模式
- 【业务架构】获得正确业务能力的 12 项必备措施
- 西安交大梁力上机实验第三章12,从0到180度每隔5度输出该角度的正弦值余弦值
- 退烧方法及退烧药的选择
- 【渝粤教育】国家开放大学2019年春季 3938管理英语2 参考试题
热门文章
- java 整合hadoop_Spark 如何摆脱java双亲委托机制优先从用户jar加载类?
- echart 折线图设置y轴单位_echarts折线图有两个图例时如何实现分别采用两个不同单位的y轴...
- php使用位运算来实现日留存的算法
- phpstudy升级mysql之后,修改配置文件无效的问题
- 每天一个linux命令(16):which命令
- 【好文推荐】springmvc教程下载
- 目标检测R-CNN模型的CNN模块微调过程分析【全网最易懂】
- 多线程 Thread类
- 生日快乐html_生日快乐,我的祖国
- 锚文本对网站SEO优化有什么帮助?