Luogu P2279 [HNOI2003]消防局的设立
这真的是一道SB题。去你的树形DP
我们看到题目就开始考虑贪心,怎么搞?
一个显然的思路,每次找出一个深度最大且未被覆盖的点,然后建一个消防局?
但这样的话,动用简单的人类思维就可以知道:我TM的还不如放在它爷爷(父节点的父节点)处呢
然后考虑有没有反例。。。。。。30min later
怎么一个反例都没有?那么说明这个贪心是正确的了?
接下来我们来简单证明一下贪心的正确性:
由于这个点是当前深度最大且未被覆盖的点,因此所有深度比它深的点都被覆盖了。
然后没有被覆盖且可以被这个点覆盖的点还有以下几类:
- 它自己(or 兄弟)
- 它的父亲节点
- 它的爷爷节点
然后我们很容易发现,当把消防站设立在它爷爷处不仅可以覆盖到所有1,2,3情况的点,还可以多往上覆盖一些点。
然后我们直接贪即可。由于这里我们可以通过BFS的顺序直接得出这些点的深度(这样就直接排好序了)
最后一个一个弹出判断即可,复杂度\(O(N)\)。
CODE
#include<cstdio>
#include<cstring>
#include<cctype>
using namespace std;
const int N=1005;
struct edge
{
int to,next;
}e[N<<1];
int head[N],cnt,n,x,father[N],q[N],ans;
bool vis[N];
inline char tc(void)
{
static char fl[100000],*A=fl,*B=fl;
return A==B&&(B=(A=fl)+fread(fl,1,100000,stdin),A==B)?EOF:*A++;
}
inline void read(int &x)
{
x=0; char ch; while (!isdigit(ch=tc()));
while (x=(x<<3)+(x<<1)+ch-'0',isdigit(ch=tc()));
}
inline void double_add(int x,int y)
{
e[++cnt].to=y; e[cnt].next=head[x]; head[x]=cnt;
e[++cnt].to=x; e[cnt].next=head[y]; head[y]=cnt;
}
inline void BFS(int x)
{
register int i,H=0,T=1; q[1]=x; vis[x]=1;
while (H<T)
{
int now=q[++H];
for (i=head[now];~i;i=e[i].next)
if (!vis[e[i].to]) q[++T]=e[i].to,vis[e[i].to]=1;
}
}
inline void reset(int now,int d)
{
if (d>2) return; vis[now]=1;
for (register int i=head[now];~i;i=e[i].next)
reset(e[i].to,d+1);
}
int main()
{
//freopen("CODE.in","r",stdin); freopen("CODE.out","w",stdout);
register int i; read(n);
memset(head,-1,sizeof(head));
for (i=2;i<=n;++i)
read(x),double_add(i,x),father[i]=x; BFS(1);
memset(vis,0,sizeof(vis)); father[1]=1;
while (n)
{
if (!vis[q[n]]) ++ans,reset(father[father[q[n]]],0); --n;
}
return printf("%d",ans),0;
}
Luogu P2279 [HNOI2003]消防局的设立的更多相关文章
- [luogu]P2279 [HNOI2003]消防局的设立[贪心]
[luogu]P2279 [HNOI2003]消防局的设立 题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两 ...
- 【luogu P2279 [HNOI2003]消防局的设立】 题解
题目链接:https://www.luogu.org/problemnew/show/P2279 想怎么贪怎么贪 #include <queue> #include <cstdio& ...
- P2279 [HNOI2003]消防局的设立
P2279 [HNOI2003]消防局的设立考场上想出了贪心策略,但是处理细节时有点问题,gg了.从(当前深度最大的节点)叶子节点往上跳k个,在这里设消防局,并从消防局遍历k个距离,标记上. #inc ...
- 洛谷P2279 [HNOI2003]消防局的设立
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- P2279 [HNOI2003]消防局的设立 贪心or树形dp
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- 洛谷 P2279 [HNOI2003]消防局的设立
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- 洛谷 P2279 [HNOI2003]消防局的设立 题解
每日一题 day34 打卡 Analysis 这道题的正解本来是树形dp,但要设5个状态,太麻烦了.于是我就用贪心试图做出此题,没想到还真做出来了. 考虑当前深度最大的叶子结点,你肯定要有一个消防局去 ...
- P2279 [HNOI2003]消防局的设立[树形dp]
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- Luogu 2279 [HNOI2003]消防局的设立 - 贪心
Description 给定一棵树形图, 建若干个消防站, 消防站能够覆盖到距离不超过2的点, 求最少需要建几个消防站才能覆盖所有点 Solution 从深度最深的点开始, 在它的爷爷节点上建, 每建 ...
随机推荐
- Linux 学习笔记之超详细基础linux命令 Part 12
Linux学习笔记之超详细基础linux命令 by:授客 QQ:1033553122 ---------------------------------接Part 11---------------- ...
- Angular 2基础(一) 环境搭建
Angular2是一款开源JavaScript库,由Google维护,用来创建页面应用程序.正式发布于2016年9月,基于ES6开发. 一.准备工作 使用Angular2开发,需要预先做一些配置上的配 ...
- [iOS]多线程和GCD
新博客wossoneri.com 进程和线程 进程 是指在系统中正在运行的一个应用程序. 每个进程之间是独立的,每个进程均运行在其专用且受保护的内存空间内. 比如同时打开QQ.Xcode,系统就会分别 ...
- linux中使用nfs共享文件
NFS需要使用远程过程调用 (RPC),也就是说,我们并不是只要启动NFS, 还需要启动RPC这个服务 服务器端 CentOS 7.4 ip:172.16.0.1 共享/tmp目录 共享/data目录 ...
- [20170927]hugepages与内核参数nr_overcommit_hugepages.txt
[20170927]hugepages与内核参数nr_overcommit_hugepages.txt /proc/sys/vm/nr_overcommit_hugepages specifies h ...
- GC Ergonomics间接引发的锁等待超时问题排查分析
1. 问题背景 上周线上某模块出现锁等待超时,如下图所示: 我虽然不是该模块负责人,但出于好奇,也一起帮忙排查定位问题. 这里的业务背景就是在执行到某个地方时,需要去表中插入一批数据,这批数据需要根据 ...
- SQL 加载
首先新建表 第一张表 order_info 第二张表 user_info 登录mysql mysql -u root -p 在开始加载数据之前配置编码 查看默认编码 show variables li ...
- 编译apache报APR not found
系统环境: [vagrant@rs-2 download]$ cat /etc/redhat-release CentOS release 5.6 (Final) [vagrant@rs-2 dow ...
- redis缓存设计
1:缓存技术和框架的重要性 互联网的一些高并发,高性能的项目和系统中,缓存技术是起着功不可没的作用.缓存不仅仅是key-value的简单存取,它在具体的业务场景中,还是很复杂的,需要很强的架构设计能力 ...
- 左侧多级菜单,高亮显示js
左侧多级菜单,如果本页面是当前栏目,则左侧菜单高亮显示 <ul class="nav navbar-stacked" id="navs"> {ded ...