题面

​ 题目的意思大概是给你一棵n个点的树, 求最少需要多少个多少个点, 整棵树都被覆盖(覆盖的意思是所有离被选中的点距离不大于k的点都视作已覆盖).

​ 考虑贪心(其实我考试的时候以为是道树形dp, 虽然说树形dp也是一种可行的方法, 但是估计全网应该没有一篇是这么做的...), 观察到最深的点, 若当前节点没有被覆盖, 则可以选择他的k级祖先, 因为选择<k级的祖先必然没有选择k级的祖先更优(单调不升), 如果没有k级父亲, 就选择根节点. 根据bfs序的倒序(从更深的点向更浅的点扫描), 一个个检查该节点是否被控制, 如果没有, 就去选择它的k级父亲, 接下来引用题解PPT中的一句话:我们令点i离最近的被驻扎的点的距离是d[i], 我们令f[i] = max(-1, k - d[i]). 选择的时候, 若周围的点的f[i]有变化, 就直接暴力更新周围点的状态, 大不了就是O(n)嘛...

​ 这样的话, 复杂度就是:

\[O(nk)
\]

​ 多好啊......

具体代码

#include <iostream>
#include <cstring>
#include <cstdio>
#include <queue>
#define N 100005
#define itn int
using namespace std; int n, K, t, head[N], stack[N], fa[N], cnt, top, f[N], ans;
struct node
{
itn to, next;
} edge[N << 1]; inline int read()
{
int x = 0, w = 1;
char c = getchar();
while(c < '0' || c > '9') { if (c == '-') w = -1; c = getchar(); }
while(c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar(); }
return x * w;
} inline void add(int u, int v) { edge[++cnt].to = v; edge[cnt].next = head[u]; head[u] = cnt; } inline void bfs()
{
queue<int> q;
q.push(1); stack[++top] = 1;
while(!q.empty())
{
int u = q.front(); q.pop();
for(int i = head[u]; i; i = edge[i].next)
{
int v = edge[i].to; if(v == fa[u]) continue;
fa[v] = u; stack[++top] = v; q.push(v);
}
}
} inline void down(int u)
{
if(!f[u]) return;
for(int i = head[u]; i; i = edge[i].next)
{
int v = edge[i].to;
if(f[v] < f[u] - 1) { f[v] = f[u] - 1; down(v); }
}
} int main()
{
freopen("general.in", "r", stdin);
freopen("general.out", "w", stdout);
n = read(); K = read(); t = read();
for(int i = 1; i < n; i++)
{
int u = read(), v = read();
add(u, v); add(v, u);
}
if(K == 0) { printf("%d\n", n); return 0; }
bfs();
memset(f, -1, sizeof(f));
for(int i = n; i >= 1; i--)
{
if(f[stack[i]] == -1)
{
ans++;
int j = stack[i];
for(int k = K; k; k--) j = fa[j];
f[j] = K;
down(j);
}
}
printf("%d\n", ans);
return 0;
}

​ 实在是有问题就在下面说吧, 反正我也基本上不会回答...

[luogu3942] 将军令的更多相关文章

  1. luogu3942将军令

    https://www.zybuluo.com/ysner/note/1302132 题面 在大小为\(n\)的树上选择尽量少的点,使得所有未选择的点距离选择了的点小于等于\(k\). \(n\leq ...

  2. luogu3942 将军令 贪心

    题目大意:给你一个地图(树),共有1~n个驿站(点),编号分别为1~n,告诉你第ui个驿站与第vi个驿站有一条长度为1的路(边),每个小队(可以放在任意驿站上)最多有k的覆盖长度,问最多要放置多少个小 ...

  3. 洛谷 P3942 将军令 解题报告

    P3942 将军令 题目描述 又想起了四月. 如果不是省选,大家大概不会这么轻易地分道扬镳吧? 只见一个又一个昔日的队友离开了机房. 凭君莫话封侯事,一将功成万骨枯. 梦里,小\(F\)成了一个给将军 ...

  4. P3942 将军令

    P3942 将军令 梦里,小 F 成了一个给将军送密信的信使. 现在,有两封关乎国家生死的密信需要送到前线大将军帐下,路途凶险,时间紧迫.小 F 不因为自己的祸福而避趋之,勇敢地承担了这个任务. 不过 ...

  5. [洛谷P3942] 将军令

    洛谷题目链接:将军令 题目背景 历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 题目描述 又 ...

  6. 8.11 NOIP模拟测试17 入阵曲+将军令+星空

    T1 入阵曲 前缀和维护可以得60分 f[x1][y1][x2][y2]=sum[x2][y2]-sum[x1-1][y2]-sum[x2][y1-1]+sum[x1-1][y1-1];  O(n4) ...

  7. 【题解】将军令 Luogu P3942 (未完成)

    历史/落在/赢家/之手 至少/我们/拥有/传说 谁说/败者/无法/不朽 拳头/只能/让人/低头 念头/却能/让人/抬头 抬头/去看/去爱/去追 你心中的梦 将军令 题目描述 又想起了四月. 如果不是省 ...

  8. NOIP模拟测试17「入阵曲&#183;将军令&#183;星空」

    入阵曲 题解 应用了一种美妙移项思想, 我们先考虑在一维上的做法 维护前缀和$(sum[r]-sum[l-1])\%k==0$可以转化为 $sum[r]\% k==sum[l-1]\%k$开个桶维护一 ...

  9. noip模拟10[入阵曲·将军令·星空](luogu)

    对于这次考试来说,总体考得还是不错的 就是有一个小问题,特判一定要判对,要不然和不判一样,甚至错了还会挂掉30分 还有一个就是时间分配问题,总是在前几个题上浪费太多时间,导致最后一个题完全没有时间思考 ...

随机推荐

  1. vue项目引入element

    前提工作-安装并配置好以下环境: 1.安装node  2.安装git 1.初始化项目 vue init webpack vue-elementui npm run dev 2.安装element np ...

  2. Linux学习6-Linux常用命令(2)

    目录处理命令     命令名称:mkdir 命令英文原意:make directories 命令所在路径:/bin/mkdir 执行权限:所有用户 功能描述:创建新目录 语法:mkdir -p[目录名 ...

  3. 【学习笔记】--- 老男孩学Python,day13 生成器,生成器函数,各种推倒式和生成器表达式

    1. 生成器和生成器函数 生成器的本质就是迭代器 生成器的三种创建办法: 1.通过生成器函数 2.通过生成器表达式创建生成器 3.通过数据转换   2. 生成器函数: 函数中包含了yield的就是生成 ...

  4. Mac下 KGDB连接Linux

    kgdb按照资料说可以使用网络(kgdboe)和串口连接(kgdboc)等方式连接. 这里使用后者,资料比较多,下面是自己在Mac上进行配置连接的过程. 先说一下环境: 主机:Mac OSX 10.1 ...

  5. thinkphp3.2 success方法和redirect方法

    $this->redirect('showlist',array(),3,'添加成功'); $this->success('添加成功',U('showlist'),3);

  6. mysql if()

    类似三元运算符 ,"男","女") 结果:

  7. 语义化的HTML及其目的

    一.什么是语义化的HTML? 语义化的HTML就是写出的HTML代码,符合内容的结构化(内容语义化),选择合适的标签(代码语义化),能够便于开发者阅读和写出更优雅的代码的同时让浏览器的爬虫和机器很好地 ...

  8. Portal的安全代理(反向代理出口)配置架构

    对于正式运行的环境,一般需要设置网络安全控制区DMZ,通过代理,把仅需要的端口向客户端暴露,其他内部端口应该是在防火墙包含之内的. 下文将针对ArcGIS 的Portal软件,讲述在DMZ中如何架构的 ...

  9. Two ways to invert a string

    package com.itheima_07; import java.util.Scanner; /* * 字符串反转 * 举例:键盘录入”abc” * 输出结果:”cba” * * 分析: * A ...

  10. windows 删除删除不掉的文件

    DEL /F /A /Q \\?\%1RD /S /Q \\?\%1 windows下删除删除不掉的文件: 1.打开记事本,把上面的命令复制进去 2.保存,后缀名改为.bat,ok 3.把想要删除的文 ...