BZOJ1217:[HNOI2003]消防局的设立
我对贪心的理解: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]消防局的设立的更多相关文章
- BZOJ1217: [HNOI2003]消防局的设立
BZOJ1217: [HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地. 起初为了节约材料,人类只修建了n-1条道路来连接这些基地 ...
- bzoj1217: [HNOI2003]消防局的设立 [树形dp]
Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了 ...
- 【BZOJ1217】[HNOI2003]消防局的设立 树形DP
[BZOJ1217][HNOI2003]消防局的设立 Description 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地, ...
- BZOJ 1217: [HNOI2003]消防局的设立( 贪心 )
一个简单的贪心, 我们只要考虑2个消防局设立的距离为5时是最好的, 因为利用最充分. 就dfs一遍, 再对根处理一下就可以了. 这道题应该是SGU某道题的简化版...这道题距离只有2, 树型dp应该也 ...
- P2279 [HNOI2003]消防局的设立
P2279 [HNOI2003]消防局的设立考场上想出了贪心策略,但是处理细节时有点问题,gg了.从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上. #inc ...
- [HNOI2003]消防局的设立 (贪心)
[HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达, ...
- [luogu]P2279 [HNOI2003]消防局的设立[贪心]
[luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两 ...
- 【洛谷P2279】[HNOI2003]消防局的设立
消防局的设立 题目链接 贪心:每次取出深度最大的节点,若没有被覆盖到,要想覆盖它, 最优的做法显然是将它的爷爷设为消防局 (因为该节点深度为最大,选兄弟.父亲所覆盖的节点,选了爷爷后都能够覆盖) 用优 ...
- BZOJ1217或洛谷2279 [HNOI2003]消防局的设立
BZOJ原题链接 洛谷原题链接 该题有两种做法,树形\(DP\)和贪心. 先讲贪心. 先将所有点按深度从大到小排序,然后从大到小依次取出点,若已经被覆盖则跳过,否则就在它的祖父点建立消防站. 考虑如何 ...
随机推荐
- visual studio2017 无法添加引用 未能加载包ReferenceManagerPackage not such interface support 解决方法
安装完visual studio 2017 后添加引用总是提示 未能加载包ReferenceManagerPackage, 这个问题困扰了两天,直到在网上看到了下面这一段 I just got thi ...
- less (css预处理)
用法 1. 必须在head内 2. 样式文件必须先加载 <head> <meta charset='utf-8'> <link rel="stylesheet/ ...
- Linux安装virtualenvwrapper详细步骤
1.[root@localhost ~]# pip install virtualenvwrapper 2.[root@localhost ~]# pip list [root@localhost ~ ...
- ABAP内表数据做层次XML输出
*&---------------------------------------------------------------------**& Report Z_BARRY ...
- (3)mac下"-bash: mysql: command not found"解决方案
针对 mysql: command not found 输入命令 $ ln -s /usr/local/mysql/bin/mysql /usr/bin 假如你人品不好,被打脸了,提示你权限不够: l ...
- 提供的STC89C52RC单片机GPS在LCD1602液晶只显示welcome to use问题?
1.使用USB-TTL接GPS单独测试GPS定位在所处环境看是否能定位到. 2.检查自己使用的单片机是不是STC89C52RC型号,提供例程使用的这个型号单片机.如果使用其他51单片机,请先使用STC ...
- Ionic常见问题
1.sh: 1: glxinfo: not found sudo apt-get update && sudo apt-get install mesa-utils 2.ionic s ...
- PAT 天梯赛 L2-009. 抢红包 【排序】
题目链接 https://www.patest.cn/contests/gplt/L2-009 思路 用结构体存储,然后结构体排序 注意一下 个人编号是从 1 开始 计数的 AC代码 #include ...
- 纯CSS3垂直动画菜单
在线演示 本地下载
- File Space——一个java structs2.0的小栗子(DIY)
1 概述 File Space系统适用于团体,主要提供的是团队文件分享以及个人文件的存储管理服务.分为个人文件存储管理平台和团队文件共享平台. 个人文件存储平台主要为个人提供相关的文件分类存储服务:该 ...