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. [转载]C++ 入门教程(41课时) - 阿里云大学

    C++ 教程 C++ 是一种中级语言,它是由 Bjarne Stroustrup 于 1979 年在贝尔实验室开始设计开发的.C++ 进一步扩充和完善了 C 语言,是一种面向对象的程序设计语言.C++ ...

  2. 洛谷 P5540 [BalkanOI2011] timeismoney | 最小乘积生成树

    题意 给一个无向图,边有两个权 \(a\) 和 \(b\),定义一个生成树的权值是 \(\left(\sum\limits_{e\in T}a_e\right)\left(\sum\limits_{e ...

  3. GPT3:人工智能时代的新型语言模型

    目录 GPT-3:人工智能时代的新型语言模型 随着人工智能技术的不断发展,自然语言处理领域也迎来了新的里程碑.GPT-3 是当前最具代表性的语言模型之一,它具有如下特点: GPT-3 是一种全新的语言 ...

  4. CF1654E Arithmetic Operations 题解

    摘自我的洛谷博客. 题目让我们求改变数字的最少次数,那我们转化一下, 求可以保留最多的数字个数 \(cnt\),再用 \(n\) 减一下就行,即 \(res = n - cnt\). 我们先考虑两种暴 ...

  5. python学习笔记:第九章异常

    1.1 异常是什么 python使用异常对象来表示异常状态,并在遇到错误时引发异常.异常对象未被处理,程序将终止并显示一条错误信息. 我们可以通过各种方法引发和捕获错误,并采取对应措施. 1.2 将& ...

  6. Windows电脑环境变量(用户变量、系统变量)的修改

      本文介绍在Windows 10操作系统中,进行用户变量.系统变量等两种环境变量的新建.修改与删除的详细方法.   在很多时候,我们需要对Windows电脑的环境变量加以修改,例如安装一些专业软件. ...

  7. ZEGO即构自建MSDN有序网络,为实时音视频传输极致顺畅!

    由于疫情反扑,音视频云通讯的使用需求再次增加,跨机房环境经常遇到网络通信质量不佳的问题,比如延迟.卡顿.画质不清晰等.网络状况是影响用户体验最大因素之一,因此提升用户网络体验的需求被各家产品highl ...

  8. 再见RestTemplate,Spring 6.1新特性:RestClient 了解一下!

    在最近发布的Spring 6.1 M2版本中,推出了一个全新的同步HTTP客户端:RestClient.用一句话来让Spring开发者认识RestClient的话:像WebClient一样具备流畅AP ...

  9. DataGridView 控件分页

    在使用Winform开发桌面应用时,工具箱预先提供了丰富的基础控件,利用这些基础控件可以开展各类项目的开发.但是或多或少都会出现既有控件无法满足功能需求的情况,或者在开发类似项目时,我们希望将具有相同 ...

  10. Unity UGUI的RawImage(原始图片)组件的介绍及使用

    Unity UGUI的RawImage(原始图片)组件的介绍及使用 1. 什么是RawImage组件? RawImage是Unity UGUI中的一个组件,用于显示原始图片.与Image组件不同,Ra ...