每日一题 day34 打卡

Analysis

这道题的正解本来是树形dp,但要设5个状态,太麻烦了。于是我就用贪心试图做出此题,没想到还真做出来了。

考虑当前深度最大的叶子结点,你肯定要有一个消防局去覆盖它,

那么既然他是叶子结点,所以与他距离小于等于2的节点有这么

  1. 他的父亲 2. 他的兄弟 3. 他的爷爷

容易看出,在前两项能够覆盖到的节点,在爷爷那里设立一定也能覆盖到。

所以每次贪心取出深度最大的节点,在他的爷爷哪里放一个消防站

用STL的priority_queue,时间复杂度O(nlogn)

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
#define int long long
#define R register
#define maxn 1000+10
#define rep(i,s,e) for(register int i=s;i<=e;++i)
using namespace std;
inline int read()
{
int x=;
bool f=;
char c=getchar();
for(; !isdigit(c); c=getchar()) if(c=='-') f=;
for(; isdigit(c); c=getchar()) x=(x<<)+(x<<)+c-'';
if(f) return x;
return -x;
}
inline void write(int x)
{
if(x<){putchar('-');x=-x;}
if(x>)write(x/);
putchar(x%+'');
}
int n,cnt,ans;
int head[maxn*maxn],dep[maxn],fa[maxn],book[maxn];
struct node
{
int v,nex;
}edge[*maxn*maxn];
struct cmp
{
bool operator () (int &a,int &b)
{
return dep[a]<dep[b];
}
};
priority_queue<int,vector<int>,cmp> q;
inline void add(int x,int y)
{
edge[++cnt].v=y;
edge[cnt].nex=head[x];
head[x]=cnt;
}
void calc_deep(int from,int father,int deep)
{
dep[from]=deep;
fa[from]=father;
for(int i=head[from];i;i=edge[i].nex)
{
int to=edge[i].v;
if(to==father) continue;
calc_deep(to,from,deep+);
}
}
void update(int from,int wide)
{
if(wide>) return;
book[from]=;
for(int i=head[from];i;i=edge[i].nex)
{
int to=edge[i].v;
update(to,wide+);
}
}
signed main()
{
n=read();
rep(i,,n-)
{
int x=read();
add(i+,x);add(x,i+);
}
calc_deep(,,);
rep(i,,n) q.push(i);
while(!q.empty())
{
while(!q.empty()&&book[q.top()]==) q.pop();
if(q.empty()==) break;
if(fa[fa[q.top()]]==) update(,);
else if(fa[fa[q.top()]]>) update(fa[fa[q.top()]],);
ans++;
}
write(ans);
return ;
}

请各位大佬斧正(反正我不认识斧正是什么意思)

洛谷 P2279 [HNOI2003]消防局的设立 题解的更多相关文章

  1. 洛谷 P2279 [HNOI2003]消防局的设立 (树形dp or 贪心)

    一看到这道题就知道是树形dp 之前做过类似的题,只不过保护的范围是1 所以简单很多. 这道题保护的范围是2,就复杂了很多. 我就开始列状态,然后发现竟然有5种 然后我就开始列方程. 但是我考虑的时候是 ...

  2. 洛谷P2279 [HNOI2003]消防局的设立

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

  3. 洛谷 P2279 [HNOI2003]消防局的设立

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

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

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

  5. 洛谷 2279 [HNOI2003]消防局的设立

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

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

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

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

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

  8. 【luogu P2279 [HNOI2003]消防局的设立】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2279 想怎么贪怎么贪 #include <queue> #include <cstdio& ...

  9. P2279 [HNOI2003]消防局的设立 贪心or树形dp

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

随机推荐

  1. python学习-65 继承2-子类中调用父类的方法

    子类中调用父类的方法 1.子类继承了父类的方法,然后想进行修改,那么就需要在子类中调用父类的方法. 2.方法一:父类名 class School: Country = 'china' def __in ...

  2. 100天搞定机器学习|Day55 最大熵模型

    1.熵的定义 熵最早是一个物理学概念,由克劳修斯于1854年提出,它是描述事物无序性的参数,跟热力学第二定律的宏观方向性有关:在不加外力的情况下,总是往混乱状态改变.熵增是宇宙的基本定律,自然的有序状 ...

  3. flask框架(三)——路由系统route转换成add_url_rule及源码分析

    这节我们不用@app.route来写路由,而是通过add_url_rule 传统写法  (<int:nid>传递int类型参数,endpoint是取别名) @app.route('/det ...

  4. Microsoft的考验――查找第二大的数

    #include<stdio.h> int main() { int n,m,t,max,max1; scanf("%d",&n); while(n--) { ...

  5. AS3中 is,as,typeof的区别

    AS3中 is,as,typeof的区别 . var my_num:Number=9;trace(typeof my_num);var my_object:Array=["语文", ...

  6. JAVA MyBybatis分页

    java: import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; impo ...

  7. JavaJDK多任务执行框架(六)

    class Temp extends Thread { public void run() { System.out.println("run"); } } public clas ...

  8. Java内存模型——方法区

    方法区(Method Area) ①      对每个加载的类型,JVM必须在方法区中存储以下类信息: 1)        这个类型的完整有效名(类型信息) 类型名称在Java类文件和JVM中都以完整 ...

  9. java之hibernate之基于外键的一对一单向关联映射

    这篇讲解基于外键的一对一单向关联映射 1.考察如下信息,人和身份证之间是一个一对一的关系.表的设计 注意:基于外键的一对一关联的表结构和多对一的表结构是一致的,但是,外键是唯一的. 2.类的结构 Pe ...

  10. Expanded, SingleChildScrollView, CustomScrollView, container, height, width

    SingleChildScrollView, CustomScrollView, container, init: double.inifinity. then use Expanded to con ...