BZOJ 4557 JLOI2016 侦查守卫 树形dp
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557
题意概述:
给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给出一些点,问控制这些点的最小代价是多少。
分析:
观察一下数据范围发现算算法的复杂度可能和d有关。横看竖看这像是一个树形dp,所以我们就把d搞到状态方程里面去嘛怎么就完全没有想到呢......
既然要用树形dp,就要先分析一下性质。
一个点如果被选择成为控制点,那么它可以控制的点有:子树中深度不超过d的点,祖先中和它距离不超过d的点,以及祖先的子树中的一些点。
感觉很麻烦的样子......因为对于那些祖先子树中的点控制的方向突然向上又向下了。
我们考虑到常用的技巧,在树形dp中,如果两个点会对答案产生贡献,我们在其LCA处统计贡献。于是我们设两个dp方程:
f(i,x)表示i点的子树中需要被控制的点全部被控制,还可以向上控制x层的最小代价;g(i,x)表示i点的子树中x层及以下需要被控制的点全部被控制的最小代价。
需要向上控制x层,那么儿子中就需要有点可以向上控制x +1层的点被选择,对于新来的子树j有两种情况,一个是我们需要的点在这个新的子树中,一个是我们需要的点在原来的子树中。
f(i,x)=min(f(i,x)+g(j,x),f(j,x+1)+g(i,x+1))
init:一开始把每点i当成孤点,那么向上控制1~d层就只有靠自己,f值初始化为w[i];f[i][0],g[i][0]根据这个点本身是否需要监视来判断。
但是注意答案在控制的长度恰好为x的时候不一定是最优的,可能稍微控制的长度大一点答案反而更优,于是把方程的意义改一下,改成至少控制x层。
g(i,x)=sum{g(j,x-1)|i->j},g(i,0)=f(i,0)
小技巧:怎么维护至少这个性质?和看起来更劣的状态取min即可。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#include<set>
#include<map>
#include<vector>
#include<cctype>
#define inf 1e9
using namespace std;
const int maxn=;
const int maxd=; int N,D,M,W[maxn];
struct edge{ int to,next; }E[maxn<<];
int first[maxn],np,f[maxn][maxd],g[maxn][maxd];
bool ob[maxn]; void _scanf(int &x)
{
x=;
char ch=getchar();
while(ch<''||ch>'') ch=getchar();
while(ch>=''&&ch<='') x=x*+ch-'',ch=getchar();
}
void add_edge(int u,int v)
{
E[++np]=(edge){v,first[u]};
first[u]=np;
}
void data_in()
{
_scanf(N);_scanf(D);
for(int i=;i<=N;i++) _scanf(W[i]);
_scanf(M);
int x,y;
for(int i=;i<=M;i++){
_scanf(x); ob[x]=;
}
for(int i=;i<N;i++){
_scanf(x);_scanf(y);
add_edge(x,y); add_edge(y,x);
}
}
void DFS(int i,int fa)
{
for(int d=;d<=D;d++) f[i][d]=W[i];
f[i][D+]=inf;
if(ob[i]) f[i][]=g[i][]=W[i];
for(int p=first[i];p;p=E[p].next){
int j=E[p].to;
if(j==fa) continue;
DFS(j,i);
for(int d=;d<=D;d++)
f[i][d]=min(f[i][d]+g[j][d],f[j][d+]+g[i][d+]);
for(int d=D;d>=;d--) f[i][d]=min(f[i][d],f[i][d+]);
g[i][]=f[i][];
for(int d=;d<=D;d++) g[i][d]+=g[j][d-];
for(int d=;d<=D;d++) g[i][d]=min(g[i][d],g[i][d-]);
}
}
void work()
{
DFS(,);
printf("%d\n",f[][]);
}
int main()
{
data_in();
work();
return ;
}
BZOJ 4557 JLOI2016 侦查守卫 树形dp的更多相关文章
- bzoj 4557: [JLoi2016]侦察守卫【树形dp】
设f[u][i]为u点向下覆盖至少i层并且处理完u的子树的最小代价,f[u][i]为u点向上覆盖至少i层并且处理完u的子树的最小代价 转移的话显然f[u][i]+=f[v][i-1],但是f[u][0 ...
- bzoj 4557: [JLoi2016]侦察守卫 树归
bzoj 4557: [JLoi2016]侦察守卫 设f[x][j]表示覆盖以x为根的子树的所有应该被覆盖的节点,并且以x为根的子树向下j层全部被覆盖的最小代价. 设g[x][j]表示与x距离大于j全 ...
- [BZOJ 4033] [HAOI2015] T1 【树形DP】
题目链接:BZOJ - 4033 题目分析 使用树形DP,用 f[i][j] 表示在以 i 为根的子树,有 j 个黑点的最大权值. 这个权值指的是,这个子树内部的点对间距离的贡献,以及 i 和 Fat ...
- [BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩)
[BZOJ 4455] [ZJOI 2016] 小星星 (树形dp+容斥原理+状态压缩) 题面 给出一棵树和一个图,点数均为n,问有多少种方法把树的节点标号,使得对于树上的任意两个节点u,v,若树上u ...
- [BZOJ4557][JLOI2016]侦查守卫
4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MBSubmit: 297 Solved: 200[Submit][Status ...
- BZOJ4557 JLoi2016 侦察守卫 【树形DP】*
BZOJ4557 JLoi2016 侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是 ...
- BZOJ 4557: [JLoi2016]侦察守卫
题目大意:每个点有一个放置守卫的代价,同时每个点放置守卫能覆盖到的距离都为d,问覆盖所有给定点的代价是多少. 题解: 树形DP f[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上覆盖y层的最 ...
- BZOJ 2286 消耗战 (虚树+树形DP)
给出一个n节点的无向树,每条边都有一个边权,给出m个询问,每个询问询问ki个点,问切掉一些边后使得这些顶点无法与顶点1连接.最少的边权和是多少.(n<=250000,sigma(ki)<= ...
- BZOJ 2435 道路修建 NOI2011 树形DP
一看到这道题觉得很水,打了递归树形DP后RE了一组,后来发现必须非递归(BFS) 递归版本84分: #include<cstdio> #include<cstring> #in ...
随机推荐
- 复习宝典之Spring
查看更多宝典,请点击<金三银四,你的专属面试宝典> 第六章:Spring Spring容器是Spring的核心,一切Spring bean都存储在Spring容器内,并由其通过IoC技术管 ...
- es6 Proxy对象详解
Proxy用于修改某些操作的默认行为,也可以理解为在目标对象之前架设一层拦截,外部所有的访问都必须先通过这层拦截,因此提供了一种机制,可以对外部的访问进行过滤和修改.这个词的原理为代理,在这里可以表示 ...
- 配置一个nginx反向代理&负载均衡服务器
一.基本信息 系统(L):CentOS 6.9 #下载地址:http://mirrors.sohu.com 反代&负载均衡(N):NGINX 1.14.0 #下载地址:http://nginx ...
- laravel4.2 Redis 使用
laravel4.2 Redis 使用 配置文件,app/config/database.php 'redis' => array( 'cluster' => false, 'defaul ...
- Python学习4——print打印
print(): 在控制台输出变量的值: print打印完后换行: print(123) # 完整模式:print(123,end="\n") 希望打印完不换行: print(1 ...
- pyhton新手学习之增删改查
一 .列表的定义 1.列表的定义 names = [ "xiajiqni", "test", "wangwu","oldb ...
- Maximum sum
描述 Given a set of n integers: A={a1, a2,-, an}, we define a function d(A) as below: t1 t2 d(A) = max ...
- JavaWeb——课程管理系统(1)jsp界面---18.11.29
add.jsp <%@page import="com.jaovo.msg.Util.ValidateUtil"%><%@page import="co ...
- 笔记-django- HttpRequest/Response
笔记-django- HttpRequest/Response 1. HttpRequest/Response When a page is requested, Django create ...
- mfc通过MapWinGIS控件读取shp文件(通过#import实现)
在MFC工程中想使用MapWinGIS组件,有多种方法可以实现, 第一种方法,#Import来实现 1.首先注册MapWinGIS ActiveX组件, 2.新建一个单文档工程:MapGis,为控件添 ...