题解P3942_将军令

初始数组忘了赋初值,,,我真是个机灵鬼
还有这题是三倍经验P2279&&P2016,这题的实现思想来自P2279首个题解

 

luogu

简化题意

给你一棵树,你有一些可以覆盖范围为$k$的障碍物,问最少放几个障碍物可以使树上所有节点覆盖

思想

这题贪心的思路其他题解写的十分清楚。首先,每一次选的点不和之前选的点所覆盖的区间重合,否则不优(这点很显然),所以我们每次可以找到一个最低的点,选取它的第K级祖先来覆盖这个点。$ta$和$ta$的祖先之间就标记为已覆盖

代码实现讲解

实现难点在判断该点是否被覆盖,每个点被覆盖的情况有三种

  • 被自己的孩子所覆盖
    • 此时直接在$ta$的孩子建立时就标记
  • 被自己的祖先所覆盖
    • 开一个数组${fa[]}$去记录
  • 被自己的兄弟所覆盖
    • 开一个数组${dis[i]}$表示离$i$最近的障碍物离$i$的距离,当${dis[fa[i]]==k-1}$时,我们就可以确定,$i$肯定就会被覆盖

每次在放置完障碍物之后,还要记得更新${dis[]}$的值

顺便一提,这种方法的普适性很强,可以解决半径为k的最小覆盖问题。而且不用存图。只需要把维护“父亲和爷爷”改成维护“上位k位祖先”即可,复杂度O(N*K),常数也很小。————BJpers2

这题的代码实现就是这句话的延申

代码实现

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 using namespace std;
 6 const int maxn=1e6+10;
 7 struct ziji{int id,dep;}mn[maxn];
 8 #define id(i) mn[i].id
 9 #define dep(i) mn[i].dep
10 int n,k,t,fa[maxn],dis[maxn],ans,tot;
11 int head[maxn],ver[maxn<<1],nxt[maxn<<1];
12 inline bool cmp(ziji a,ziji b){
13     return a.dep>b.dep;
14 }
15 inline int g() { register int x=0,f=1;
16     register char ch; while(!isdigit(ch=getchar())) f=ch=='-'?-1:f;
17     do x=x*10+(ch^48); while(isdigit(ch=getchar())); return x*f;
18 } 
19 inline void add(int x,int y){
20     ver[++tot]=y,nxt[tot]=head[x],head[x]=tot;
21 }
22 inline void dfs(int x,int f){
23     dep(x)=dep(f)+1;fa[x]=f;
24     for(register int i=head[x];i;i=nxt[i]){
25         int y=ver[i];if(y==f) continue;dfs(y,x);
26     }
27 }
28 int main(){
29     n=g(),k=g(),t=g();
30     id(1)=1,dis[0]=dis[1]=maxn;
31     for(register int i=1;i<=n;i++) id(i)=i;
32     memset(dis,0x3f,sizeof(dis));
33     for(register int i=2;i<=n;i++){
34         int x,y;x=g(),y=g();
35         add(x,y),add(y,x);
36     }dfs(1,1);
37     sort(mn+1,mn+1+n,cmp);
38     for(register int i=1;i<=n;i++){
39         int x=id(i),y=x;
40         for(register int j=1;j<=k;j++)
41             y=fa[y],dis[x]=min(dis[x],dis[y]+j);
42         if(dis[x]>k){
43             dis[y]=0,ans++;
44             for(register int j=1;j<=k;j++)
45                 y=fa[y],dis[y]=min(dis[y],j);
46         }
47     }
48     printf("%d",ans);
49 }
View Code

 

转载于:https://www.cnblogs.com/fallen-down/p/11577534.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549477.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Hitv8 文件批量重命名工具

本工具用于单文件或批量文件文件名、文件类型扩展名重命名的小工具&#xff0c;欢迎使用&#xff01;使用说明&#xff1a; 1、使用拖放方式&#xff0c;将文件拖入列表框即可 2、可以不输文件名&#xff0c;表示文件名不变&#xff0c;只改类型&#xff1b; 类型也可以自已输入…

[SCOI2009]生日礼物 单调性尺取法

题意&#xff1a;给你n个k种颜色的点&#xff0c;每个点都有坐标和颜色两个属性&#xff0c;选出一个长度尽量短的区间&#xff0c;使得每种颜色的点都在区间内出现。 数据范围&#xff1a; 对于50%的数据&#xff0c; N≤10000&#xff1b; 对于80%的数据&#xff0c; N≤8000…

就算忘了自己也忘不了你

就算忘了自己也忘不了你——代腾飞 2009年4月24日 于成都曾经你说要我紧紧地抱住你让我们的两颗心能紧贴在一起用你的柔情将他们水浮交融彼此渗透到对方的心底我毫不犹豫照做 曾经你说你要用你的脚轻轻放在我的胸膛上你好走到离我心最近的地方让你的脚印镌刻在我的心里成为不…

PJ2018T4 对称二叉树 树形结构

题意&#xff1a;现在给出一棵二叉树&#xff0c;希望你找出它的一棵子树&#xff0c;该子树为对称二叉树&#xff0c;且节点数最多。请输出这棵子树的节点数。对称二叉树满足&#xff1a;将这棵树所有节点的左右子树交换后&#xff0c;新树和原树对应位置的结构相同且点权相等…

Flex的事件(十四)

一、 关于键盘事件<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />程序响应一个按键或一系列按键并执行一些动作&#xff0c;例如Controlq退出程序。Flex支持所有来自后台操作系统的所有组合键操作&#xff0c;它同样允许你覆…

EditPlus构建轻量级编译环境

你还在为机子跑VS&#xff0c;VC6.0吃力而苦恼吗&#xff1f;最近发现网上一个小窍门&#xff0c;就是用EditPlus文本编辑器构建轻量级编译环境&#xff0c; 轻量级的东西就是受人喜欢&#xff0c;要不说Spring能流行起来呢。最近自学C#&#xff0c;有了Java思想&#xff0c;加…

OCP-052考试题库汇总(58)-CUUG内部解答版

In one of your databases: 1.USER1 and USER2 have no system privileges. 2.ROLE1 only has these privileges: ?CREATE SESSION ?CREATE TABLE ?CREATE VIEW Examine these commands: SQL> conn / as sysdba Connected. SQL> GRANT create table, role1 TO user1 W…

提高ASP.Net应用程序性能的十大方法

一、返回多个数据集 检查你的访问数据库的代码&#xff0c;看是否存在着要返回多次的请求。每次往返降低了你的应用程序的每秒能够响应请求的次数。通过在单个数据库请求中返回多个结果集&#xff0c;可以减少与数据库通信的时间&#xff0c;使你的系统具有扩展性&#xff0c;…

【NOIP2015提高组】子串 区间DP+滚动数组优化

题意&#xff1a; 有两个仅包含小写英文字母的字符串 A 和 B。 现在要从字符串 A 中取出 k 个互不重叠的非空子串&#xff0c;然后把这 k 个子串按照其在字符串 A 中出现的顺序依次连接起来得到一个新的字符串。 请问有多少种方案可以使得这个新串与字符串 B 相等&#xff1f; …

教你如何去淘便宜机票

机票四月二十日集体变相涨价后&#xff0c;中央电视台曾经报道&#xff0c;今后没有5折以下机票&#xff0c;今后也不再叫多少折&#xff0c;而是直接报价&#xff0c;但是春秋航空不再此之列&#xff0c;原因是这次变相提价是一个叫中航信公司在操作&#xff0c;他们不代理春秋…

使用kibana或postman操作Elasticsearch的常用命令

前言服务器&#xff1a;CentOS-6.7 运行系统&#xff1a;windows10 JDK版本&#xff1a;1.8 Elasticsearch版本&#xff1a;5.6.6 插件&#xff1a;kibana、elasticsearch-head 工具&#xff1a;postman 一、集群查看集群是否健康 GET /_cluster/health二、节点查看节点列表后面…

asp.net 实现一级域名与二级域名共享COOKIE

COOKIE可以自动由子级域名分享&#xff0c;无须做什么特别设置。对网站www.abc.com&#xff0c;check.abc.com来说&#xff0c;它们都是二级域名&#xff0c;一级域名是abc.com。所以&#xff0c;保存COOKIE的时候&#xff0c;将Cookie的Domain设置成“.abc.com”&#xff0c;无…

32位单精度浮点乘法器的FPGA实现

摘 要: 采用Verilog HDL语言, 在FPGA上实现了32位单精度浮点乘法器的设计, 通过采用改进型Booth编码&#xff0c;和Wallace 树结构, 提高了乘法器的速度。本文使用Altera Quartus II 4.1仿真软件, 采用的器件是EPF10K100EQ 240 -1, 对乘法器进行了波形仿真, 并采用0.5CMOS工艺…

Elasticsearch修改字段之别名,扩展数据迁移

https://blog.csdn.net/amaranth__/article/details/84497075 转载于:https://www.cnblogs.com/zeenzhou/p/11588599.html

网工视频13第13章.计算机系统开发运行与配置疑难问题

网工视频请留下你的邮箱&#xff0c;我给你发邮件。转载于:https://blog.51cto.com/ricebetter2010/155609

ES 基本操作

0.查看集群是否健康GET /_cluster/health 1.查询所有索引GET /_cat/indices?v 2.查询单个索引的映射GET /index_trans_detail/_mapping 3.删除indexDELETE /index_trans_detail,index_two 4. 添加字段映射PUT /index_trans_detail/_mapping/type_trans_detail{ "properti…

我们的运动会

不久前&#xff0c;我们举办了微软中国研发集团的首届运动会。遗憾的是&#xff0c;当时我自己由于公务在身没能参加。事后同事们把许多精彩的图片与我分享&#xff0c;让我十分羡慕他们有机会大显身手&#xff0c;现在贴出来让大家看看他们的飒爽英姿&#xff0c;一睹为快。运…

ES建立索引步骤, 1,index 2.mapping 3,别名

1.建立索引PUT /index_trans_detail 2.建立mappingPOST /index_trans_detail/type_trans_detail/_mapping{ "type_trans_detail": { "properties": { "id": { "type": "long" }, "entId": { "type": &q…

java路径问题

Java路径 Java中使用的路径&#xff0c;分为两种&#xff1a;绝对路径和相对路径。具体而言&#xff0c;又分为四种&#xff1a; 一、URI形式的绝对资源路径 如&#xff1a;file:/D:/java/eclipse32/workspace/jbpmtest3/bin/aaa.b URL是URI的特例。URL的前缀/协议&#xff0c;…

题解P1613跑路

今天没什么好说的那我就卖个萌吧(&#xff5e;&#xffe3;▽&#xffe3;)&#xff5e; Luogu 一道思维题可能仅是对我来说&#xff0c;对于大佬们都是显然的 简化题意 给你一个图&#xff0c;找到一个路径&#xff0c;使其路径的二进制位中\(1\)的个数最少 分析 这题的题目就…