洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)
经典题一道,下次就称这种”覆盖距离不超过 xxx 的树形 dp“为《侦察守卫模型》
我们考虑树形 \(dp\),设 \(f_{x,j}\) 表示钦定了 \(x\) 子树内的点选/不选的状态,且 \(x\) 子树内必须要被覆盖的点都被覆盖,\(x\) 的 \(1\sim j\) 级祖先都被覆盖了的最小代价,再设 \(g_{x,j}\) 表示 \(x\) 子树内距离 \(x\ge j\) 的必须要被覆盖的点都被覆盖,而 \(x\) 子树内距离 \(x\) \(<j\) 的点及 \(x\) 的祖先的覆盖状态不做要求的最小代价。根据 \(f,g\) 的定义容易发现:
- \(\forall i,j,g_{x,i}\le f_{x,j}\),(证明?显然!)
- \(g_{x,0}=f_{x,0}\)(证明?显然!)
接下来考虑如何转移,假设我们往 \(u\) 子树内加入一个 \(v\) 子树,那么有:
- \(f_{u,i}=\min(f_{u,i}+g_{v,i},g_{u,i+1}+f_{v,i+1})\)
- \(g_{u,i}=g_{u,i}+g_{v,i-1}\)
- \(g_{u,0}=f_{u,0}\)
稍微解释一下上面三个式子,首先第三个式子根据 \(dp\) 数组的定义即可明白。\(f\) 的转移中,\(\min\) 里面第一个表示 \(u\) 本来就可以向上覆盖的情况,由于 \(u\) 可以向上覆盖 \(i\) 的距离,自然也可以向下覆盖 \(i\) 的距离,此时只要 \(v\) 子树内距离 \(v\) \(\ge i\) 的点都被覆盖了就符合要求,故代价为 \(f_{u,i}+g_{v,i}\),后面的 \(g_{u,i+1}+f_{v,i+1}\) 也是同样的道理,只不过这里 \(u\) 要向上覆盖 \(i\),\(v\) 就必须要向上覆盖 \(i+1\)。有人可能会问,两个 \(f\) 加在一起的转移到哪里去了?被你吃了?不难发现,根据 \(\forall i,j,g_{x,i}\le f_{x,j}\),两个 \(f\) 的转移肯定不如一 \(f\) 一 \(g\) 来得优,因此我们肯定不会两个 \(f\) 加在一起。而 \(g\) 的转移就相对来说比较容易了,只要 \(v\) 子树内距离 \(v\) \(\ge i\) 的点都被覆盖了就符合”\(u\) 子树内距离 \(u\) \(\ge i\) 的点都被覆盖“的要求。
同时,根据 \(f,g\) 的定义,还有:
- \(f_{u,i}=\min(f_{u,i},f_{u,i-1})\)
- \(g_{u,i}=\min(g_{u,i},g_{u,i+1})\)
这样我们就成功地处理了转移有关的问题。
最后就是 DFS 到某个点时 DP 数组的初始值,首先 \(f_{x,i}=w_x(i\in[1,D])\),因为当你只有一个点时,只有放置侦察守卫才能向上覆盖,而如果 \(x\) 是 B 神可能出现的位置,那么有 \(f_{x,0}=g_{x,0}=w_x\),否则 \(f_{x,0}=g_{x,0}=0\),因为如果 B 神不可能出现在 \(x\),那么 \(x\) 不一定要被覆盖。
时间复杂度 \(\Theta(nD)\)。
貌似这题和 CF1517F 很像?要是我早半年做到这道题说不定我那场就能一下涨上 2500 了(bushi
const int MAXN=5e5;
const int MAXD=20;
const int INF=0x3f3f3f3f;
int n,d,w[MAXN+5],hd[MAXN+5],to[MAXN*2+5],nxt[MAXN*2+5],ec=0,vis[MAXN+5];
void adde(int u,int v){to[++ec]=v;nxt[ec]=hd[u];hd[u]=ec;}
int f[MAXN+5][MAXD+2],g[MAXN+5][MAXD+2];
void dfs(int x,int fa){
for(int i=1;i<=d;i++) f[x][i]=w[x];f[x][d+1]=INF;
if(vis[x]) f[x][0]=g[x][0]=w[x];
for(int e=hd[x];e;e=nxt[e]){
int y=to[e];if(y==fa) continue;dfs(y,x);
for(int i=d;~i;i--) f[x][i]=min(f[x][i]+g[y][i],g[x][i+1]+f[y][i+1]);
for(int i=d;~i;i--) f[x][i]=min(f[x][i],f[x][i+1]);
g[x][0]=f[x][0];
for(int i=1;i<=d;i++) g[x][i]+=g[y][i-1];
for(int i=1;i<=d;i++) chkmin(g[x][i],g[x][i-1]);
}
}
int main(){
scanf("%d%d",&n,&d);
for(int i=1;i<=n;i++) scanf("%d",&w[i]);
int m;scanf("%d",&m);while(m--){int x;scanf("%d",&x);vis[x]=1;}
for(int i=1,u,v;i<n;i++) scanf("%d%d",&u,&v),adde(u,v),adde(v,u);
dfs(1,0);printf("%d\n",f[1][0]);
return 0;
}
洛谷 P3267 - [JLOI2016/SHOI2016]侦察守卫(树形 dp)的更多相关文章
- 洛谷 P3267 [JLOI2016/SHOI2016]侦察守卫(树形dp)
题面 luogu 题解 树形\(dp\) \(f[x][y]表示x的y层以下的所有点都已经覆盖完,还需要覆盖上面的y层的最小代价.\) \(g[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上 ...
- 洛谷 P3177 [HAOI2015]树上染色 树形DP
洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...
- 洛谷P1040 加分二叉树(树形dp)
加分二叉树 时间限制: 1 Sec 内存限制: 125 MB提交: 11 解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...
- 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp
正解:树形dp 解题报告: 传送门! 昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两 ...
- 洛谷 P4201 设计路线 [NOI2008] 树形dp
正解:树形dp 解题报告: 大概是第一道NOI的题目?有点激动嘻嘻 然后先放个传送门 先大概港下这题的题意是啥qwq 大概就是给一棵树,然后可以选若干条链把链上的所有边的边权变成0,但是这些链不能有交 ...
- P3267 [JLOI2016/SHOI2016]侦察守卫
$ \color{#0066ff}{ 题目描述 }$ 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的 ...
- 洛谷P1351 联合权值(树形dp)
题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...
- 洛谷P4099 [HEOI2013]SAO(树形dp)
传送门 HEOI的题好珂怕啊(各种意义上) 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小有关,与实际数值无关) 我们考虑 ...
- 洛谷 P1351 联合权值 —— 树形DP
题目:https://www.luogu.org/problemnew/show/P1351 树形DP,别忘了子树之间的情况(拐一下距离为2). 代码如下: #include<iostream& ...
随机推荐
- 手把手教你写hexo博客
市面上现在有各种博客框架,本博客教大家的是Hexo博客框架,目前比较火.搭建博客中遇到各种各样问题,网上方案也比较成熟. 一.搭建环境 安装 git 安装 node.js 安装 Hexo npm in ...
- springboot 事务执行全流程分析
springboot 事务执行全流程分析 目录 springboot 事务执行全流程分析 1. 事务方法执行前的准备工作 2. 业务代码的调用 3. 事务方法执行后处理 4. 业务代码在事务和非事务中 ...
- 浅谈如何爆踩TLEcoders
对付一些速度比老奶奶都慢的评测姬, 除了超级小的常数,往往还不得不使用一些不算办法的办法 比如说这个让人无语的$ACcoders$的评测姬, 当我们感到代码已经无法再卡常的时候,对人生已经近乎绝望的时 ...
- 从零开始的DIY智能浇水应用
前言 作为一个新世纪打工人,平常也会去养一些花草,来给我的房间增加点绿色和活力,但是常常因为工作忙而忘记一些事情.,毕竟我大部分的时间都是陪伴着电脑的(严正声明:我不是个单身狗!!! (¬◡¬)✧), ...
- Python matplotlib pylot和pylab的区别
matplotlib是Python中强大的绘图库. matplotlib下pyplot和pylab均可以绘图. 具体来说两者的区别 pyplot 方便快速绘制matplotlib通过pyplot模块提 ...
- 表示数值的字符串 牛客网 剑指Offer
表示数值的字符串 牛客网 剑指Offer 题目描述 请实现一个函数用来判断字符串是否表示数值(包括整数和小数).例如,字符串"+100","5e2"," ...
- 2021 ICPC Gran Premio de Mexico 2da Fecha部分题题解
前面的水题,在队友的配合下,很快就拿下了,剩下几道大毒瘤题,一直罚座三个小时,好让人自闭...但不得不说,这些题的质量是真的高! H. Haunted House 首先看这个题,大眼一扫,觉得是某种数 ...
- 绝世好题(DP)
题目链接:绝世好题 暴力就不用说了,和lis神似,O(n2)妥妥的挂掉,但可以得大部分分(好像是90,80)... 考虑优化,来一发非正解的优化: #include<bits/stdc++.h& ...
- 0x03
指数级枚举:1到n任意选取的所有方案数: #include<bits/stdc++.h> using namespace std; int n,a[1100],vis[1100],cnt, ...
- laravel路由导出和参数加密
路由导出 代码位置:\vendor\laravel\framework\src\Illuminate\Foundation\Console\RouteListCommand.php protected ...