只看45分的话,是树形DP....(当然也有能拿到70分+的大佬)

40分:

只考虑k==1的情况,树形DP

所以每个节点可能被父亲,自己,儿子控制

设f[MAXN][3],0表示儿子,1表示自己,2表示父亲

f[i][1]+=min(f[to][0],f[to][1],f[to][2])(因为自己控制自己,儿子怎样都行)

f[i][0]+=min(f[to][0],f[to][1])

但是因为i的儿子必须有一个自己控制自己,所以还要判断所加值中是否有f[to][1],如果没有

f[i][0]+=min(f[to][1]-f[to][0])

f[i][2]+=min(f[to][1],f[to][0])

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<map>
6 #include<vector>
7 #include<set>
8 #include<cmath>
9 #define MAXN 600001
10 #define int long long
11 using namespace std;
12 struct node{int to,n;}e[MAXN*2];
13 int head[MAXN],tot;
14 void add(int u,int v)
15 {
16 e[++tot].to=v;e[tot].n=head[u];head[u]=tot;
17 }
18 int read()
19 {
20 int x=0;char c=getchar();
21 while(c<'0'||c>'9')c=getchar();
22 while(c>='0'&&c<='9')
23 {
24 x=(x<<1)+(x<<3)+(c^48);
25 c=getchar();
26 }
27 return x;
28 }
29 int f[MAXN][4];//0 儿子 1 自己 2 父亲
30 void DFS(int x,int fa)
31 {
32 int ok=1,minn=100000;
33 f[x][1]=1;
34 for(int i=head[x];i;i=e[i].n)
35 {
36 int to=e[i].to;
37 if(to==fa)continue;
38 DFS(to,x);
39 if(f[to][1]<=f[to][0])
40 {
41 f[x][0]+=f[to][1];
42 ok=0;
43 }
44 else f[x][0]+=f[to][0];
45 f[x][1]+=min(f[to][1],min(f[to][2],f[to][0]));
46 f[x][2]+=min(f[to][1],f[to][0]);
47 }
48 if(ok==1)
49 {
50 for(int i=head[x];i;i=e[i].n)
51 {
52 int to=e[i].to;
53 if(to==fa)continue;
54 minn=min(minn,f[to][1]-f[to][0]);
55 }
56 f[x][0]+=minn;
57 }
58 }
59 int n,k,t;
60 signed main()
61 {
62 n=read();k=read();t=read();
63 for(int i=1;i<=n-1;++i)
64 {
65 int x,y;
66 x=read();y=read();
67 add(x,y);add(y,x);
68 }
69 if(k==0)
70 {
71 printf("%lld\n",n);
72 return 0;
73 }
74 DFS(1,0);
75 printf("%lld\n",min(f[1][1],f[1][0]));
76 }

45分

100分

贪心很好想吧.....

每次选出深度最大的节点,找到他的第k级祖先,然后暴力修改他的k距离范围内的点

正确性的话,我们每次恰好选k级祖先(或根),对于覆盖范围来说,肯定比k级祖先的父亲和儿子要好啦啦.....

 1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 #include<string>
5 #include<map>
6 #include<vector>
7 #include<set>
8 #include<algorithm>
9 #include<cmath>
10 #include<queue>
11 #define MAXN 1000001
12 using namespace std;
13 struct node{int to,n;}e[MAXN*2];
14 int n,k,t;
15 int head[MAXN],tot=0;
16 int read()
17 {
18 char c=getchar();int x=0;
19 while(c<'0'||c>'9')c=getchar();
20 while(c>='0'&&c<='9')
21 {
22 x=(x<<1)+(x<<3)+(c^48);
23 c=getchar();
24 }
25 return x;
26 }
27 void add(int u,int v)
28 {
29 e[++tot].to=v;e[tot].n=head[u];head[u]=tot;
30 }
31 priority_queue<pair<int,int> >q;
32 int fa[MAXN];
33 int deep[MAXN];
34 void DFS(int x,int faa)
35 {
36 q.push(make_pair(deep[x],x));
37 for(int i=head[x];i;i=e[i].n)
38 {
39 int to=e[i].to;
40 if(faa==to)continue;
41 fa[to]=x;
42 deep[to]=deep[x]+1;
43 DFS(to,x);
44 }
45 }
46 bool vis[MAXN];
47 int find(int x,int kk)
48 {
49 if(deep[x]<=kk)return 1;
50 while(kk!=0)
51 {
52 kk--;
53 x=fa[x];
54 }
55 return x;
56 }
57 void check(int x,int faa,int root,int kx)
58 {
59 if(kx>k)return ;
60 vis[x]=1;
61 //printf("vis[%d]=%d deep[%d]=%d\n",x,vis[x],root,deep[root]);
62 for(int i=head[x];i;i=e[i].n)
63 {
64 int to=e[i].to;
65 if(to==faa)continue;
66 check(to,x,root,kx+1);
67 }
68 return ;
69 }
70 int ans=0;
71 void work()
72 {
73 while(!q.empty())
74 {
75 int top=q.top().second;
76 //printf("top=%d\n",top);
77 q.pop();
78 if(vis[top]==1)continue;
79 int faa=find(top,k);
80 //printf("faa=%d\n",faa);
81 check(faa,0,faa,0);
82 ans++;
83 }
84 }
85 signed main()
86 {
87 n=read();k=read();t=read();
88 for(int i=1;i<=n-1;++i)
89 {
90 int x,y;
91 x=read();y=read();
92 add(x,y);add(y,x);
93 }
94 deep[1]=1;
95 DFS(1,0);
96 work();
97 printf("%d\n",ans);
98 }

还有要注意的一点,在找与祖先相邻为k的点时暴力查找,不看深度。。。。

【模拟8.11】将军令(贪心&&树形DP)的更多相关文章

  1. bzoj 1907: 树的路径覆盖【贪心+树形dp】

    我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...

  2. 联赛模拟测试25 C. Repulsed 贪心+树形DP

    题目描述 分析 考虑自底向上贪心 \(f[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的需要灭火器的房间数,\(g[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的多余灭火器 ...

  3. [JZOJ5400]:Repulsed(贪心+树形DP)

    题目描述 小$w$心里的火焰就要被熄灭了. 简便起见,假设小$w$的内心是一棵$n-1$条边,$n$个节点的树. 现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个. 接下来每个节点都要被分配 ...

  4. BZOJ 4027:[HEOI2015]兔子与樱花(贪心+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4027 [题目大意] 樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...

  5. codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】

    直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...

  6. BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP

    题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...

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

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

  8. CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树

    http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...

  9. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

随机推荐

  1. Tensorflow Probability Distributions 简介

    摘要:Tensorflow Distributions提供了两类抽象:distributions和bijectors.distributions提供了一系列具备快速.数值稳定的采样.对数概率计算以及其 ...

  2. 如何实现一个 System Services?

    <Android 系统开发做什么?>写到 Android System Services 是专注于特定功能的模块化组件,应用框架 API 所提供的功能可与系统服务通信,以访问底层硬件.An ...

  3. 2021最新Java面试题全集-20210326版

    在手撕了数千道网络流传的面试题,外加十多个不眠之夜, 终于从里面精心挑选出约500道题目, 做为大家求职.跳槽前复习准备面试使用. 一:挑选题目的原则: 常考的.常被面试问到的 题目有一定的深度和难度 ...

  4. linux使用createrepo制作本地yum源

    目录 linux使用createrepo制作本地yum源 安装createrepo软件包 进入本地rpm包目录 执行完后可以看到生成的repodata目录 编辑yum配置文件使用 完成,测试使用 关于 ...

  5. Python应用与实践-转自(吴秦(Tyler))

    1.      Python是什么? 1.1.      Python语言 1.2.      Python哲学 2.      Python在工作中的应用 2.1.      实例1:文件批量处理 ...

  6. IDEA workspace.xml 在 git 中无法忽略 ignore 问题

    问题描述 关于 .idea 的文件夹中的 workspace.xml 设置 ignore 之后每次 commit 依旧提示需要提交改变,这就会导致, 每次merge就会导致提示"本地文件改变 ...

  7. python set去重简析

    python 中的集合可以去重是实现了__hash__与__eq__ 当class没有定义__eq__()方法时,那么它也不应该定义__hash__()方法.如果它定义了__eq__()方法,却没有定 ...

  8. 痞子衡嵌入式:快速定位i.MXRT600板级设计ISP[2:0]启动模式引脚上电时序问题的方法

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是一种快速定位i.MXRT600板级设计ISP[2-0]启动模式引脚上电时序问题的方法. 我们知道恩智浦i.MXRT600是主打音频市场的 ...

  9. 使用Typora编写Markdown你真的会了吗

    目录 Typora 介绍 使用 常用快捷键 概述 标题 一级标题 二级标题 方式(推荐) 一级标题 二级标题 三级标题 四级标题 五级标题 六级标题 段落 粗体斜体删除线 下划线 注释 分割线 脚注 ...

  10. 书列荐书 |《刻意练习》安德斯&#183;艾利克森,罗伯特&#183;普尔著

    花了两天的时间,一气呵成的读完了这本书.凝练的精华就是:首先,世界上并没有真正的天才这一说.基因可能会起作用,但是经过后天大量的刻意练习,基因的这种作用会弱化.刻意练习需要专注.及时的反馈,并根据反馈 ...