【模拟8.11】将军令(贪心&&树形DP)
只看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)的更多相关文章
- bzoj 1907: 树的路径覆盖【贪心+树形dp】
我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...
- 联赛模拟测试25 C. Repulsed 贪心+树形DP
题目描述 分析 考虑自底向上贪心 \(f[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的需要灭火器的房间数,\(g[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的多余灭火器 ...
- [JZOJ5400]:Repulsed(贪心+树形DP)
题目描述 小$w$心里的火焰就要被熄灭了. 简便起见,假设小$w$的内心是一棵$n-1$条边,$n$个节点的树. 现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个. 接下来每个节点都要被分配 ...
- BZOJ 4027:[HEOI2015]兔子与樱花(贪心+树形DP)
[题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4027 [题目大意] 樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...
- codehunter 「Adera 6」杯省选模拟赛 网络升级 【树形dp】
直接抄ppt好了--来自lyd 注意只用对根判断是否哟留下儿子 #include<iostream> #include<cstdio> using namespace std; ...
- BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP
题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...
- P2279 [HNOI2003]消防局的设立 贪心or树形dp
题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...
- CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树
http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...
- 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心
题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...
随机推荐
- 查询某软件所连接的外网IP地址
一:背景环境: 1>:某机械公司用的某些特殊软件,需要实现所有使用某软件的屏蔽其软件所连接的外网ip,其他上网功能不做限制. 二:需求分析:可以查出此软件所连接的外网ip,在路由器的ip过滤中将 ...
- SRP(单一职责)——没有一只能飞能走的鸟
单一职责原则(SRP:Single responsibility principle)又称单一功能原则.它规定一个类应该只有一个发生变化的原因. 一.起因 编码中,需要创建一只小鸟,既能飞,用能走. ...
- java 多线程 实现多个线程的顺序执行
场景 编写一个程序,启动三个线程,三个线程的name分别是A,B,C:,每个线程将自己的ID值在屏幕上打印5遍,打印顺序是ABCABC... 使用 synchronized 实现 public cla ...
- Jenkins 基础篇 - 小试牛刀
现在我们来创建一个简单的 Jenkins 任务,这个任务输出 Java 版本信息和系统信息,通过这个任务我们先了解创建 Jenkins 任务的流程,以及了解一些对任务的基础设置,接下来就是演示任务的整 ...
- apiAutoTest:基于mitmproxy实现接口录制
目录 apiAutoTest 目前功能 重大更新(个人认为) 本次更新 契机 根本 如何录制 录制的用例 执行录制的用例 执行结果 实现源码 参考资料 apiAutoTest 先软文介绍下:apiAu ...
- kubernetes dashboard延长自动超时注销
方法1:部署清单时,修改yaml文件,添加 container.Args 增加 --token-ttl=43200 其中43200是设置自动超时的秒数.也可以设置 token-ttl=0 以完全禁用超 ...
- [bug] org.apache.spark.sql.AnalysisException: Table or view not found spark
参考 https://blog.csdn.net/weixin_44634893/article/details/89629399
- RHEL sosreport
RHEL sosreport简介 sosreport对很多RedHat爱好者来说应该并不陌生! 它是一款在RedHat Linux下帮你收集系统信息打成一个tar包的工具,你可以将这个tar包发给供应 ...
- Linux 根目录所在分区被脏数据占满
背景: 公司在做一个项目,大概功能就是一个通行闸机的人脸识别系统,要经过门禁的人注册了之后,系统就会存储一张原始的图片在服务器的数据文件夹里面,包括了永久的存储和一些访客注册临时存储.一天周五的时 ...
- k8s管理机密信息(12)
一.启动应用安全信息的保护 1.Secret介绍 应用启动过程中可能需要一些敏感信息,比如访问数据库的用户名密码或者秘钥.将这些信息直接保存在容器镜像中显然不妥,Kubernetes 提供的解决方案是 ...