Description

Link.

给你一棵树,放置守卫在某个点上面需要一定代价和一定的有效范围。让你覆盖若干指定点,求最小代价

Solution

算法标签:

$\ \ \ \ \ \ \ \ \ $ 树DP

DP状态定义:

$\ \ \ \ \ \ \ \ \ $ 说实话这道题定状态不好定。

$\ \ \ \ \ \ \ \ \ $ 那么我们从头来看,当 \(d =0\) 的时候,我们就是在求树的最大独立集,定义显而易见。

$\ \ \ \ \ \ \ \ \ $ \(d\neq 0\) 我们可以照搬原来的定义,把它扩展一下。


$\ \ \ \ \ \ \ \ \ $ \(f_{i,j}\) 表示以 \(i\) 为根结点的子树已经完全被覆盖让然后还能向上覆盖 \(j\) 层的最小代价

$\ \ \ \ \ \ \ \ \ $ \(g_{i,j}=\) 表示以 \(i\) 为根结点的子树还有 \(j\) 层没有覆盖的最小代价


$\ \ \ \ \ \ \ \ \ $ 需要注意的是 \(j\) 本质上是带有方向性的,可以类比向量的概念。

$\ \ \ \ \ \ \ \ \ $ 边界条件很显然,\(f_{i,0}=val_{i}\) 此时当前结点需要被覆盖。

$\ \ \ \ \ \ \ \ \ $ 其他情况:

\[\begin{cases}
f_{i,j}=val_{i},j\in [1,d] \\
\displaystyle
f_{i,j}=\infty,j=d+1
\end{cases}
\]

$\ \ \ \ \ \ \ \ \ $ 状态转移方程倒是比较好想,这里就不再赘述。

#include <cstdio>
#include <algorithm>
#include <queue> char buf[1 << 21], *p1 = buf, *p2 = buf;
#ifndef ONLINE_JUDGE
#define gc() getchar()
#else
#define gc() (p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
#endif
#define is_number (ch >= '0' && ch <= '9') template < typename Type >
void read(Type& a) {
a = 0; bool f = 0; char ch;
while (!(ch = gc(), is_number)) if (ch == '-') f = 1;
while (is_number) a = (a << 3) + (a << 1) + (ch ^ '0'), ch = gc();
a = (f ? -a : a);
} template < typename Type, typename... Args >
void read(Type& t, Args&... args) {
read(t), read(args...);
} int val[500005], f[500005][25];
int g[500005][25], vis[500005];
int n, m, d, tot, head[500005];
int nxt[1000005], to[1000005];
std::vector < std::vector < int > > G(500005); void add(int x, int y) {
to[++tot] = y;
nxt[tot] = head[x];
head[x] = tot;
G[x].push_back(y);
G[y].push_back(x);
} void DP(int x, int fa) {
if (vis[x]) g[x][0] = f[x][0] = val[x];
for (int i = 1; i <= d; ++i) f[x][i] = val[x];
f[x][d + 1] = 0x3f3f3f3f;
for (int i = head[x]; i; i = nxt[i]) {
int y = to[i];
if (y ^ fa) {
DP(y, x);
for (int j = d; j >= 0; --j)
f[x][j] = std::min(f[y][j + 1] + g[x][j + 1], f[x][j] + g[y][j]);
for (int j = d; j >= 0; --j)
f[x][j] = std::min(f[x][j + 1], f[x][j]);
g[x][0] = f[x][0];
for (int j = 1; j <= d + 1; ++j)
g[x][j] += g[y][j - 1];
for (int j = 1; j <= d + 1; ++j)
g[x][j] = std::min(g[x][j - 1], g[x][j]);
}
}
} signed main() {
read(n, d);
for (int i = 1; i <= n; ++i) read(val[i]);
read(m);
for (int i = 0, x; i < m; ++i) read(x), vis[x] = 1;
for (int i = 1, x, y; i < n; ++i) read(x, y), add(x, y), add(y, x);
DP(1, 0);
printf("%d\n", g[1][0]);
}

Solution -「洛谷 P3267」「JLOI 2016」「SHOI 2016」侦察守卫的更多相关文章

  1. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  2. 「 洛谷 」P2768 珍珠项链

    珍珠项链 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 题目来源 「 洛谷 」P2768 珍珠项链 ...

  3. 「 洛谷 」P4539 [SCOI2006]zh_tree

    小兔的话 推荐 小兔的CSDN [SCOI2006]zh_tree 题目限制 内存限制:250.00MB 时间限制:1.00s 标准输入输出 题目知识点 思维 动态规划 \(dp\) 区间\(dp\) ...

  4. 「 洛谷 」P2151 [SDOI2009]HH去散步

    小兔的话 欢迎大家在评论区留言哦~ HH去散步 题目限制 内存限制:125.00MB 时间限制:1.00s 标准输入 标准输出 题目知识点 动态规划 \(dp\) 矩阵 矩阵乘法 矩阵加速 矩阵快速幂 ...

  5. Solution -「CTS 2019」「洛谷 P5404」氪金手游

    \(\mathcal{Description}\)   Link.   有 \(n\) 张卡牌,第 \(i\) 张的权值 \(w_i\in\{1,2,3\}\),且取值为 \(k\) 的概率正比于 \ ...

  6. Solution -「JSOI 2019」「洛谷 P5334」节日庆典

    \(\mathscr{Description}\)   Link.   给定字符串 \(S\),求 \(S\) 的每个前缀的最小表示法起始下标(若有多个,取最小的).   \(|S|\le3\time ...

  7. Solution -「洛谷 P4372」Out of Sorts P

    \(\mathcal{Description}\)   OurOJ & 洛谷 P4372(几乎一致)   设计一个排序算法,设现在对 \(\{a_n\}\) 中 \([l,r]\) 内的元素排 ...

  8. Solution -「POI 2010」「洛谷 P3511」MOS-Bridges

    \(\mathcal{Description}\)   Link.(洛谷上这翻译真的一言难尽呐.   给定一个 \(n\) 个点 \(m\) 条边的无向图,一条边 \((u,v,a,b)\) 表示从 ...

  9. Solution -「APIO 2016」「洛谷 P3643」划艇

    \(\mathcal{Description}\)   Link & 双倍经验.   给定 \(n\) 个区间 \([a_i,b_i)\)(注意原题是闭区间,这里只为方便后文描述),求 \(\ ...

  10. 「P4994」「洛谷11月月赛」 终于结束的起点(枚举

    题目背景 终于结束的起点终于写下句点终于我们告别终于我们又回到原点…… 一个个 OIer 的竞赛生涯总是从一场 NOIp 开始,大多也在一场 NOIp 中结束,好似一次次轮回在不断上演.如果这次 NO ...

随机推荐

  1. Dubbo负载均衡策略之 一致性哈希

    本文主要讲解了一致性哈希算法的原理以及其存在的数据倾斜的问题,然后引出解决数据倾斜问题的方法,最后分析一致性哈希算法在Dubbo中的使用.通过这篇文章,可以了解到一致性哈希算法的原理以及这种算法存在的 ...

  2. 常用的Java Enum JdbcType

    常用的Java Enum JdbcType ARRAY BIGINT BINARY BIT BLOB BOOLEAN CHAR CLOB CURSOR DATE DECIMAL DOUBLE FLOA ...

  3. Spring框架参考手册(4.2.6版本)翻译——第三部分 核心技术 6.10.8 提供带注解的限定符元数据

    6.1.1 提供带注解的限定符元数据 在第6.9.4节"使用@Qualifier微调基于注解的自动装配"中讨论了@Qualifier注解.该部分中的示例阐释了,在解析自动装配候选者 ...

  4. SpringBoot RabbitMQ 实战解决项目中实践

    1 基础预览 1.1 环境准备 Springboot 1.5.6.RELEAS Springcloud Dalston.SR2 1.2 交换机类型 交换机是用来发送消息的AMQP实体.交换机拿到一个消 ...

  5. influxdb 中得 fields 与 tag 区别总结

    本位为博主原创,转载请注明出处: 1.Field与Tag说明 在 InfluxDB 表结构中,field 和 tag 是用于存储数据的两种不同类型. Field(字段): Field 用于存储实际的数 ...

  6. allure报告生成

    allure生成测试报告 ‍1.生成xml文件 pytest 测试文件所在路径 --alluredir 生成的测试结果数据保存的目录 pytest --alluredir=resport/xml/ D ...

  7. Pycharm里Python运行窗口显示乱码���的解决方法

    当你的Python程序运行后,会在运行窗口中显示乱码 ��� 等字样,如下 原因是 Pycharm中默认设置只显示UTF-8编码的格式,需要修改支持显示中文支持. 解决方法: 菜单中选择 File S ...

  8. 2023-07-12:RocketMQ如何做到消息不丢失?

    2023-07-12:RocketMQ如何做到消息不丢失? 答案2023-07-12: RocketMQ通过刷盘机制.消息拉取机制和ACK机制等多种方式来确保消息投递的可靠性,防止消息丢失. 1.刷盘 ...

  9. Geo

    Geo 应用情景 打车时寻找半径在多少范围的司机 查找附近的酒店,微信摇一摇 Linux中文乱码如何处理? redis-cli --raw docker: docker exec -it redis ...

  10. Node版本更新及切换

    Node版本升级 # 清除npm缓存 npm cache clean -f # n模块是专门用来管理nodejs的版本,安装n模块 npm install -g n 1.Windows 由于n命令是在 ...