P3267 [JLOI2016/SHOI2016] 侦察守卫 题解

news/2025/1/15 17:23:38/文章来源:https://www.cnblogs.com/Rock-N-Roll/p/18410789

P3267 [JLOI2016/SHOI2016] 侦察守卫 题解

\(n\le 5\times10^5,D\le20\) 的数据范围显然想到 \(O(nd)\) 的树形 dp。考虑 \(d\) 这一维的状态设计。

考虑 \(i\) 子树中的情况分为全部被覆盖和未全部被覆盖两种。

  • 对于第一种,显然我们要考虑子树中能 向上覆盖影响的点 的个数,于是设 \(f_{i,j}\) 表示 \(i\) 子树内最大能向上贡献 \(j\) 个点的最小值。
  • 对于第二种,那么子树上方一定还会再放守卫,于是 当前子树之内的守卫等价于不会再做出贡献,只需要考虑最深的未被覆盖的点的深度。于是设 \(g_{i,j}\) 表示 \(i\) 子树内深度最深为 \(j\) 的点未被覆盖。

那么这个描述最值的状态定义是不好转移的,于是加上前缀最小值的限制就好转移了。依次枚举 \(x\) 的每个子节点 \(y\) 转移,转移完再前缀最小值。

方程容易列出:

\[f_{x,j}=\min(f_{x,j}+g_{y,j},f_{y,j+1}+g_{x,j+1}) \]

\[g_{x,y}\leftarrow g_{y,j-1} \]

含义是分别考虑做 \(j\) 贡献是 \(y\) 还是 \(y\) 以前的子节点。

本题的关键是能够清晰分类,并且想到按照情况确定 \(d\) 这一维不同的状态设计。

代码:

#include <bits/stdc++.h>
#define N 500005
#define M 22
using namespace std;
int n, d;
int m;
struct Node {int to, nxt;
} e[N << 1];
int head[N], cnt;
void add(int u, int v) {e[++cnt].to = v;e[cnt].nxt = head[u];head[u] = cnt;
}
int val[N];
int f[N][M], g[N][M];
int flg[N];
void dfs(int x, int fa) {for (int i = 1; i <= d; i++)f[x][i] = val[x];if (flg[x])f[x][0] = g[x][0] = val[x];f[x][d + 1] = 0x3f3f3f3f;for (int i = head[x]; i; i = e[i].nxt) {int y = e[i].to;if (y == fa)continue;dfs(y, x);for (int j = 0; j <= d; j++)f[x][j] = min(f[x][j] + g[y][j], f[y][j + 1] + g[x][j + 1]);for (int j = d; ~j; j--)f[x][j] = min(f[x][j], f[x][j + 1]);g[x][0] = f[x][0];for (int j = 1; j <= d; j++)g[x][j] += g[y][j - 1], g[x][j] = min(g[x][j], g[x][j - 1]);		 } 
}
int main() {cin >> n >> d;for (int i = 1; i <= n; i++)scanf("%d", &val[i]);cin >> m;while (m--) {int x;scanf("%d", &x);flg[x] = 1;}for (int i = 1; i < n; i++) {int x, y;scanf("%d%d", &x, &y);add(x, y);add(y, x);}dfs(1, 0);cout << f[1][0] << "\n";return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796156.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024秋软件工程个人作业(第二次)

这个作业属于哪个课程 https://edu.cnblogs.com/campus/fzu/SE2024这个作业要求在哪里 https://edu.cnblogs.com/campus/fzu/SE2024/homework/13253这个作业的目标 要求使用Python编写一个“羊了个羊”风格的消除类小游戏。对开发过程进行实践,更加熟悉aigc工具学号 102202135…

PbootCMS网站apache伪静态规则

<IfModule mod_rewrite.c>Options +FollowSymlinksRewriteEngine OnRewriteCond %{REQUEST_FILENAME} !-dRewriteCond %{REQUEST_FILENAME} !-fRewriteRule ^(.*)$ index.php?p=$1 [QSA,PT,L]</IfModule>扫码添加技术【解决问题】专注中小企业网站建设、网站安全1…

PbootCMS网站nginx伪静态规则

nginx #请复制下面伪静态配置到nginx配置文件中: #规则适合PbootCMS V2.0+版本location / {if (!-e $request_filename){rewrite ^/(.*)$ /index.php?p=$1 last;} }扫码添加技术【解决问题】专注中小企业网站建设、网站安全12年。熟悉各种CMS,精通PHP+MYSQL、HTML5、CSS3、J…

记一次SSH无法远程

故障现象 主机无法使用ssh远程 输入密码之后报错如下# Permission denied (password,keyboard-interactive).原因 看起来好像是远端设置了不允许用户名和密码登录 其实是客户端设置问题 修复或者注释# ChallengeResponseAuthentication no

bluecms搭建和代码审计(SQL)

bluecms搭建 将bluecms的源码文件bluecms放在www目录下,进入bluecms/install/index.php目录安装bluecms填写数据库配置信息和管理员账号信息填写完上述信息后,会自动在bluecms数据库下创建这些文件返回主界面 http://127.0.0.1/bluecms后发现管理员不能从前台登录, 需要从ht…

KubeSphere 社区双周报| 2024.08.30-09.12

KubeSphere 社区双周报主要整理展示新增的贡献者名单和证书、新增的讲师证书以及两周内提交过 commit 的贡献者,并对近期重要的 PR 进行解析,同时还包含了线上/线下活动和布道推广等一系列社区动态。 本次双周报涵盖时间为:2024.08.30-09.12。 贡献者名单近期重要更新 KubeS…

Appium+python框架搭建

一、Appium-Python-Client ①安装依赖库也就大家说的客户端,这里的客户端指的是我编辑代码的界面,因为代码界面我要引入webdriver所以叫客户端,其实本质是一个依赖库跟selenium差不多 ②安装的命令:pip install Appium-Python-Client(python环境所以安装python包) ③Appi…

2576. 求出最多标记下标

给你一个下标从 0 开始的整数数组 nums 。 一开始,所有下标都没有被标记。你可以执行以下操作任意次: 选择两个 互不相同且未标记 的下标 i 和 j ,满足 2 * nums[i] <= nums[j] ,标记下标 i 和 j 。 请你执行上述操作任意次,返回 nums 中最多可以标记的下标数目。 示例…

**** oracle 数据库-监听故障处理-故障单

**** 数据库-监听故障处理-故障单**** 数据库-监听故障处理故障反馈人张**工单接收时间2024年9月11日 9:10审核/复核人张**/张***处理完毕时间2024年9月11日 9:22报告人柏*报告时间2024年9月11日11:22故障环境IP: 180.5.115.** 数据库版本: 10.2.0.4.0故障现象告警时间: 起…

Spring声明式事务不生效?

背景 本篇博文将会讲一讲Spring中使用@Transactional注解会出现的不生效问题。事务的生效与否,一般不是我们冒烟自测的范围,测试也不会去测,但是一旦上线后,事务出现不生效的情况,就可能引发较大的问题,甚至会带来损失。所以,使用好事务注解是非常重要的,尤其是注意哪些…

UE4(5)逆向学习笔记(二)——寻找GWorld,GName和GUObjectArray

目录0.前言1.准备1.1 下载游戏《死寂(DeathlyStillness)》1.2 下载UE源码2.寻找GWorld3.寻找GName4.寻找GUObjectArray5.开始Dump5.结尾 0.前言 笔记(一)中我们了解了GWorld,GName和GUObjectArray是什么,也知道了想要使用UEDumper要获取到它们的偏移。 这次我们就以游戏《…

一个用于管理多个 Node.js 版本的安装和切换开源工具

大家好,今天给大家分享一个用于管理多个Node.js版本的工具 NVM(Node Version Manager),它允许开发者在同一台机器上安装和使用不同版本的Node.js,解决了版本兼容性问题,为开发者提供了极大的便利。在开发环境中,特别是在处理多个项目时,每个项目可能依赖于不同版本的 N…