洛谷题面传送门

经典题一道,下次就称这种”覆盖距离不超过 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)的更多相关文章

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

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

  2. 洛谷 P3177 [HAOI2015]树上染色 树形DP

    洛谷 P3177 [HAOI2015]树上染色 树形DP 题目描述 有一棵点数为 \(n\) 的树,树边有边权.给你一个在 \(0 \sim n\)之内的正整数 \(k\) ,你要在这棵树中选择 \( ...

  3. 洛谷P1040 加分二叉树(树形dp)

    加分二叉树 时间限制: 1 Sec  内存限制: 125 MB提交: 11  解决: 7 题目描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,...,n),其中数字1,2,3,...,n ...

  4. 洛谷P4438 道路 [HNOI/AHOI2018] 树形dp

    正解:树形dp 解题报告: 传送门! 昂首先看懂题目趴QwQ大概就是说有棵满二叉树,有n个叶子节点(乡村)和n-1个非叶子节点,然后这棵树的每个节点有三个属性abc,对每个非叶子节点可以从与子节点的两 ...

  5. 洛谷 P4201 设计路线 [NOI2008] 树形dp

    正解:树形dp 解题报告: 大概是第一道NOI的题目?有点激动嘻嘻 然后先放个传送门 先大概港下这题的题意是啥qwq 大概就是给一棵树,然后可以选若干条链把链上的所有边的边权变成0,但是这些链不能有交 ...

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

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

  7. 洛谷P1351 联合权值(树形dp)

    题意 题目链接 Sol 一道很简单的树形dp,然而被我写的这么长 分别记录下距离为\(1/2\)的点数,权值和,最大值.以及相邻儿子之间的贡献. 树形dp一波.. #include<bits/s ...

  8. 洛谷P4099 [HEOI2013]SAO(树形dp)

    传送门 HEOI的题好珂怕啊(各种意义上) 然后考虑树形dp,以大于为例 设$f[i][j]$表示$i$这个节点在子树中排名第$j$位时的总方案数(因为实际只与相对大小有关,与实际数值无关) 我们考虑 ...

  9. 洛谷 P1351 联合权值 —— 树形DP

    题目:https://www.luogu.org/problemnew/show/P1351 树形DP,别忘了子树之间的情况(拐一下距离为2). 代码如下: #include<iostream& ...

随机推荐

  1. Noip模拟66 2021.10.2

    T1 接力比赛 思路就是直接做背包$dp$,然后看看容量相同的相加的最大值. 考虑如何在$dp$过程中进行优化 注意到转移方程的第二维枚举容量没有必要从容量总和开始枚举 那么我们便转移边统计前缀和,从 ...

  2. Noip模拟13 2021.7.13:再刚题,就剁手&&生日祭

    T1 工业题 这波行列看反就非常尴尬.....口糊出所有正解想到的唯独行列看反全盘炸列(因为和T1斗智斗勇两个半小时...) 这题就是肯定是个O(n+m)的,那就往哪里想,a,b和前面的系数分开求,前 ...

  3. Linux C语言链表你学会了吗?

    链表是一种常见的基础数据结构,结构体指针在这里得到了充分的利用.链表可以动态的进行存储分配,也就是说,链表是一个功能极为强大的数组,他可以在节点中定义多种数据类型,还可以根据需要随意增添,删除,插入节 ...

  4. The entitlements specified in your application’s Code Signing Entitlements file do not match those s

    今天给打包 TPshop IOS (搜豹商城) ipa文件 调试运行 xcode运行提示这个错误: The entitlements specified in your application's C ...

  5. usb设备无法识别

    之前用飞线用旧板子飞线连接了一个wifi模块到usb0口上,调试ok的,现在新设计的板子回来了,wifi模块是连接在usb2口上的,系统起来后发现wlan0不存在,用lsusb查看wifi模块的usb ...

  6. 二进制插入 牛客网 程序员面试金典 C++ Python java

    二进制插入 牛客网 程序员面试金典 题目描述 有两个32位整数n和m,请编写算法将m的二进制数位插入到n的二进制的第j到第i位,其中二进制的位数从低位数到高位且以0开始. 给定两个数int n和int ...

  7. 微服务(七)Gateway服务网关

    1 为什么要有网关 权限控制:网关作为微服务入口,需要校验用户是是否有请求资格,如果没有则进行拦截. 路由和负载均衡:一切请求都必须先经过gateway,但网关不处理业务,而是根据某种规则,把请求转发 ...

  8. “TCP:三次握手”分析——以一个简单的“服务器”和“客户端”为例

    linux&C这两天学到了网络编程这一章,自己写了一个小的"服务器"和"客户端"程序,目的在于简单理解tcp/ip模型,以及要搭建一台简单服务器,服务器 ...

  9. IDEA插件和个性化配置推荐

    插件推荐 我自己现在使用的一些插件和一些自己感觉比较舒服配置分析给大家 idea如何安装插件: 如果打开设置没有看到,直接搜索plugins 然后在这里搜索即可 CodeGlance 小地图 和vsc ...

  10. Python推导式详解,带你写出比较精简酷炫的代码

    Python推导式详解,带你写出比较精简酷炫的代码 前言 1.推导式分类与用法 1.1 列表推导 1.2 集合推导 1.3 字典推导 1.4 元组推导?不存在的 2.推导式的性能 2.1 列表推导式与 ...