BZOJ 4557 (JLOI 2016) 侦查守卫
4557: [JLoi2016]侦察守卫
Time Limit: 20 Sec Memory Limit: 256 MB
Submit: 493 Solved: 342
[Submit][Status][Discuss]
Description
小R和B神正在玩一款游戏。这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的
。换句话说,游戏的地图是一棵有N个节点的树。游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦
查守卫后,它可以监视这个点以及与这个点的距离在D以内的所有点。这里两个点之间的距离定义为它们在树上的
距离,也就是两个点之间唯一的简单路径上所经过边的条数。在一个点上放置侦查守卫需要付出一定的代价,在不
同点放置守卫的代价可能不同。现在小R知道了所有B神可能会出现的位置,请你计算监视所有这些位置的最小代价
。
Input
第一行包含两个正整数N和D,分别表示地图上的点数和侦查守卫的视野范围。约定地图上的点用1到N的整数编号。
第二行N个正整数,第i个正整数表示在编号为i的点放置侦查守卫的代价Wi。保证Wi≤1000。第三行一个正整数M,
表示B神可能出现的点的数量。保证M≤N。第四行M个正整数,分别表示每个B神可能出现的点的编号,从小到大不
重复地给出。接下来N–1行,每行包含两个正整数U,V,表示在编号为U的点和编号为V的点之间有一条无向边。N<=
500000,D<=20
Output
仅一行一个整数,表示监视所有B神可能出现的点所需要的最小代价
Sample Input
12 2
8 9 12 6 1 1 5 1 4 8 10 6
10
1 2 3 5 6 7 8 9 10 11
1 3
2 3
3 4
4 5
4 6
4 7
7 8
8 9
9 10
10 11
11 12
Sample Output
10
—————————————————————————————-
题解
树形dp,定义f[x][i]表示以x为根的子树向下i层没有被覆盖的花费,
g[x][i]表示以x为根的子树完全并覆盖并且向上延伸i层的花费。
转移方程:
g[x][i]=min(g[x][i]+f[v][i],g[v][i+1]+f[x][i+1])
g[x][i]=min(g[x][i],g[x][i+1])
f[x][0]=g[x][0]
f[x][i]+=f[v][i-1]
f[x][i]=min(f[x][i],f[x][i-1])
代码
#include<iostream>
#include<cstdio>
using namespace std;
const int MAXN = 500000+5;
const int inf = 0x4fffffff;
struct Edge{
int nxt,to;
}edge[MAXN*2];
int n,m,D;
int cos[MAXN],f[MAXN][25],g[MAXN][25];
int head[MAXN],cnt;
bool vis[MAXN];
inline void add(int bg,int ed){
edge[++cnt].to=ed;
edge[cnt].nxt=head[bg];
head[bg]=cnt;
}
inline void dfs(int x,int fa){
if(vis[x]) f[x][0]=g[x][0]=cos[x];
for(register int i=1;i<=D;i++) g[x][i]=cos[x];
g[x][D+1]=inf;
for(register int i=head[x];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa) continue;
dfs(v,x);
for(register int j=D;j>=0;j--)
g[x][j]=min(g[x][j]+f[v][j],g[v][j+1]+f[x][j+1]);
for(register int j=D;j>=0;j--)
g[x][j]=min(g[x][j],g[x][j+1]);
f[x][0]=g[x][0];
for(register int j=1;j<=D+1;j++)
f[x][j]+=f[v][j-1];
for(register int j=1;j<=D+1;j++)
f[x][j]=min(f[x][j],f[x][j-1]);
}
}
int main(){
scanf("%d%d",&n,&D);
for(register int i=1;i<=n;i++)
scanf("%d",&cos[i]);
scanf("%d",&m);
for(register int i=1;i<=m;i++){
int x;
scanf("%d",&x);
vis[x]=true;
}
for(register int i=1;i<n;i++){
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1,0);
printf("%d",f[1][0]);
return 0;
}
BZOJ 4557 (JLOI 2016) 侦查守卫的更多相关文章
- 解题:JLOI 2016 侦查守卫
题面 经典的$cov-unc$树形dp(这词是你自己造的吧=.=) 设$cov[i][j]$表示覆盖完$i$的子树后至少向外再覆盖$j$层的最小代价,$unc[i][j]$表示$i$的子树中还剩下至少 ...
- loj #2024. 「JLOI / SHOI2016」侦查守卫
#2024. 「JLOI / SHOI2016」侦查守卫 题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...
- [BZOJ4557][JLOI2016]侦查守卫
4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 297 Solved: 200[Submit][Status ...
- bzoj 4557: [JLoi2016]侦察守卫 树归
bzoj 4557: [JLoi2016]侦察守卫 设f[x][j]表示覆盖以x为根的子树的所有应该被覆盖的节点,并且以x为根的子树向下j层全部被覆盖的最小代价. 设g[x][j]表示与x距离大于j全 ...
- [LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分
[LOJ 2083][UOJ 219][BZOJ 4650][NOI 2016]优秀的拆分 题意 给定一个字符串 \(S\), 求有多少种将 \(S\) 的子串拆分为形如 AABB 的拆分方案 \(| ...
- JLOI2016 侦查守卫
侦查守卫 小R和B神正在玩一款游戏.这款游戏的地图由 N 个点和 N-1 条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有 N 个节点的树. 游戏中有一种道具叫做侦查守 ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- BZOJ 4557 JLOI2016 侦查守卫 树形dp
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 题意概述: 给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给 ...
- BZOJ 4557 侦查守卫
好迷的树形dp... #include<iostream> #include<cstdio> #include<cstring> #include<algor ...
随机推荐
- python之pyquery 学习
pyquery是jQuery的Python实现,可以用以解析HTML网页的内容.官网文档:http://pythonhosted.org/pyquery/ 下载:https://pypi.python ...
- 图(graph)
一.非线性结构:图 图由顶点集V,集合规模为n,在n个顶点之间可能存在对应关系,我们用连边来描述这种,即边E,规模为e. 邻接关系:顶点与顶点之间的关系:关联关系:顶点与它相连的边的关系.序列结构(v ...
- 影响RAKsmart服务器稳定性的相关因素
RAKsmart美国服务器近年来凭借着成熟的技术和性价比吸引着广大站长,那RAKsmart服务器稳定性怎么样呢?有什么影响因素呢?下面来了解一下吧. 因素一:服务器配置 服务器能正常运营是建立在服务器 ...
- 通过statCounter计算给定的RDD[Double]的统计信息的方法
需求1:给定一个RDD[Double],进行计算,该RDD的统计信息(count,mean,stdev,max,min) 代码: def main(args: Array[String]): Unit ...
- leetcood学习笔记-111-二叉树的最小深度
题目描述: 第一次提交: class Solution(object): def minDepth(self, root): """ :type root: TreeNo ...
- wordpress翻译插件gtranslate
https://www.gdstautoparts.com/
- [原创] Java 流布局管理器 FlowLayout
参数原型: public FlowLayout(int align, int hgap, int vgap) { this.hgap = hgap; this.vgap = vgap; setAlig ...
- NX二次开发-UFUN移动工程图视图UF_DRAW_move_view
#include <uf.h> #include <uf_draw.h> #include <uf_drf.h> #include <uf_obj.h> ...
- NX二次开发-UFUN特征找xxx UF_MODL_ask_feat_xxx等函数(待补充)
NX9+VS2012 #include <uf.h> #include <uf_modl.h> #include <uf_obj.h> #include <u ...
- BZOJ随即跳题-随即到什么题你写什么题
来挑战一下吧~ 请事先登录你BZOJ的账号!