以后要记得复习鸭

BZOJ 4557

大佬的博客

状态十分好想,设$f_{x, i}$表示以覆盖完$x$为根的子树后还能向上覆盖$i$层的最小代价,$g_{x, i}$表示以$x$为根的子树下深度为$i$还没有被覆盖的最小代价。

那么对于每一个关键点,有初态:   $f_{x,0} = g_{x, 0} = val_x$。

对于不是关键点的点,有:$f_{x, i} = val_x$   $0 \leq i \leq d$   $f_{x, d + 1} = inf$。

然后就不会了

感觉关键是维护$f_x$和$g_x$的单调性,因为$f_{x, i}$一定不会大于$f_{x, i + 1}$,而$g_{x, i}$一定不会大于$g_{x, i - 1}$。

我们考虑对$x$的所有儿子$y$分开考虑,对于每一个$y$,有方程

    $f_{x, i} = min(f_{x, i} + g_{y, i}, g_{x, i + 1} + f_{y, i + 1})$。

前者表示在之前的计算中已经取了一个子结点能覆盖到$x$,现在这个结点只需要取$g_{y, i}$即可,后者表示取这个结点的$f_{y, i + 1}$,而剩下的代价最小为$g_{x, i + 1}$。

记得从上到下枚举$i$。

然后再扫一遍维护$f_{x}$的单调性。

接着考虑计算$g$,有$g_{x, 0} = f_{x, 0}$。

对于每一个$y$,有$g_{x, i} += g_{y, i - 1}$。

然后从下到上扫一遍维护$g_x$的单调性。

时间复杂度$O(nd)$。

Code:

#include <cstdio>
#include <cstring>
using namespace std; const int N = 5e5 + ;
const int M = ;
const int inf = << ; int n, m, d, a[N], tot = , head[N], f[N][M], g[N][M];
bool flag[N]; struct Edge {
int to, nxt;
} e[N << ]; inline void add(int from, int to) {
e[++tot].to = to;
e[tot].nxt = head[from];
head[from] = tot;
} inline void read(int &X) {
X = ; char ch = ; int op = ;
for(; ch > '' || ch < ''; ch = getchar())
if(ch == '-') op = -;
for(; ch >= '' && ch <= ''; ch = getchar())
X = (X << ) + (X << ) + ch - ;
X *= op;
} inline int min(int x, int y) {
return x > y ? y : x;
} inline void chkMin(int &x, int y) {
if(y < x) x = y;
} void dfs(int x, int fat) {
if(flag[x]) g[x][] = f[x][] = a[x];
for(int i = ; i <= d; i++) f[x][i] = a[x];
f[x][d + ] = inf; for(int i = head[x]; i; i = e[i].nxt) {
int y = e[i].to;
if(y == fat) continue; dfs(y, x); for(int j = d; j >= ; j--)
f[x][j] = min(f[x][j] + g[y][j], g[x][j + ] + f[y][j + ]);
for(int j = d; j >= ; j--) chkMin(f[x][j], f[x][j + ]); g[x][] = f[x][];
for(int j = ; j <= d; j++) g[x][j] += g[y][j - ];
for(int j = ; j <= d; j++) chkMin(g[x][j], g[x][j - ]);
}
} int main() {
read(n), read(d);
for(int i = ; i <= n; i++) read(a[i]);
read(m);
for(int x, i = ; i <= m; i++) {
read(x);
flag[x] = ;
}
for(int x, y, i = ; i < n; i++) {
read(x), read(y);
add(x, y), add(y, x);
} dfs(, ); printf("%d\n", f[][]);
return ;
}

Luogu 3267 [JLOI2016/SHOI2016]侦察守卫的更多相关文章

  1. BZOJ4557:[JLOI2016/SHOI2016]侦察守卫——题解

    https://www.lydsy.com/JudgeOnline/problem.php?id=4557 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点, ...

  2. 洛谷 P3267 [JLOI2016/SHOI2016]侦察守卫(树形dp)

    题面 luogu 题解 树形\(dp\) \(f[x][y]表示x的y层以下的所有点都已经覆盖完,还需要覆盖上面的y层的最小代价.\) \(g[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上 ...

  3. 洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)

    洛谷题面传送门 经典题一道,下次就称这种"覆盖距离不超过 xxx 的树形 dp"为<侦察守卫模型> 我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 ...

  4. [JLOI2016/SHOI2016]侦察守卫(树形dp)

    小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树. 游戏中有一种道具叫做侦查守卫,当一名玩家在一个点 ...

  5. P3267 [JLOI2016/SHOI2016]侦察守卫

    $ \color{#0066ff}{ 题目描述 }$ 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的 ...

  6. [JLOI2016/SHOI2016]侦察守卫

    嘟嘟嘟 这道题可以说是[HNOI2003]消防局的设立的升级版.距离从2改为了d. 辛亏d只有20,这也就是一个切入点. 令f[u][j]表示u四周 j - 1的距离需要被覆盖,g[u][j]表示u可 ...

  7. Luogu3267 [JLOI2016/SHOI2016]侦察守卫 (树形DP)

    树形DP,一脸蒙蔽.看了题解才发现它转移状态与方程真不愧神题! \(f[x][y]\)表示\(x\)的\(y\)层以下的所有点都已经覆盖完,还需要覆盖上面的\(y\)层的最小代价. \(g[x][y] ...

  8. 【BZOJ4596】【Luogu P4336】 [SHOI2016]黑暗前的幻想乡 矩阵树定理,容斥

    同样是矩阵树定理的裸题.但是要解决它需要能够想到容斥才可以. \(20\)以内的数据范围一定要试试容斥的想法. #include <bits/stdc++.h> using namespa ...

  9. DP学习记录Ⅰ

    DP学习记录Ⅱ 前言 状态定义,转移方程,边界处理,这三部分想好了,就问题不大了.重点在状态定义,转移方程是基于状态定义的,边界处理是方便转移方程的开始的.因此最好先在纸上写出自己状态的意义,越详细越 ...

随机推荐

  1. MySQL全文搜索

    http://www.yiibai.com/mysql/full-text-search.html 在本节中,您将学习如何使用MySQL全文搜索功能. MySQL全文搜索提供了一种实现各种高级搜索技术 ...

  2. 《领域驱动设计 C# 2008 实现》 - 书摘精要

    (P2) 智能客户反模式被 Eric Evans 定义为“把所有业务逻辑放进用户界面.把系统分解成小函数,作为分离的用户界面实现,并在里面嵌入业务规则.使用关系数据库作为共享的数据仓储.使用现有的自动 ...

  3. Mat ,IplImage, CvMat 之间的转换的总结

    在新版本与旧版本之间纠结,到底是用Mat,还是Iplimage? Mat 侧重于数据计算,而Iplimage注重于图像的处理. 因此,应根据具体需要灵活使用,那个好用用哪个,只要在两者之间进行转换即可 ...

  4. [TopCoder12727]FoxAndCity

    vjudge 题意 你有一张\(n\)点的无向图,每个点有一个点权\(w_i\).图中原来存在一些边,你可以任意给这张图加上一些边. 记点\(i\)到点\(1\)的距离为\(d_i\),你需要最小化\ ...

  5. 从内存中直接运行PE程序

    效果是这样的,假设一个PE数据在内存里面了,我们利用下面我讲的技术可以直接建立一个进程并运行这个PE,当然直接在本进程运行在可以,这两钟技术在前些时日我都有实现,今天我只说关于建立进程并运行的,当然, ...

  6. QAbstractSocket::connectToHost() called when already looking up or connecting/connected to

    tcpSocket_connect_HBJ->abort();//取消已有连接,重置套接字,tcpSocket_connect_HBJ是QTcpSocket类的对象 就不会报错了.

  7. Python 列表的切片和连接

    一.定义一个list >>> a = [1, 3, 4, 5, 'a', 's'] >>> a [1, 3, 4, 5, 'a', 's'] 二.获取列表中前3个元 ...

  8. JAX-WS注解

    JAX-WS注解: javax.jws.WebService @WebService应用于类或者接口上面,该类便是一个对外访问WebService,默认情况里面所有的public方法都是可以对外提供访 ...

  9. HTML5一些元素的整理

    address元素: 定义和用法 <address> 标签定义文档或文章的作者/拥有者的联系信息. 如果 <address> 元素位于 <body> 元素内,则它表 ...

  10. AngularJS:动画

    ylbtech-AngularJS:动画 1.返回顶部 1. AngularJS 动画 AngularJS 提供了动画效果,可以配合 CSS 使用. AngularJS 使用动画需要引入 angula ...