BZOJ 4557 侦查守卫
好迷的树形dp。。。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxv 500500
#define maxe 1000500
using namespace std;
int n,m,d,x,y,nume=,g[maxv],dp1[maxv][],dp2[maxv][],w[maxv],fath[maxv];
bool mark[maxv][];
struct edge
{
int v,nxt;
}e[maxe];
void addedge(int u,int v)
{
e[++nume].v=v;
e[nume].nxt=g[u];
g[u]=nume;
}
void dp(int x)
{
int flag=;
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=fath[x])
{
fath[v]=x;
dp(v);flag=;
for (int j=;j<=d;j++)
mark[x][j]|=mark[v][j-];
}
}
if (!flag)
{
if (mark[x][]) dp1[x][]=dp2[x][]=w[x];
for (int i=;i<=d;i++)
{
dp2[x][i]=w[x];
dp1[x][i]=;
}
return;
}
for (int i=;i<=d;i++)
for (int j=g[x];j;j=e[j].nxt)
{
int v=e[j].v;
if (v!=fath[x])
dp1[x][i]+=dp1[v][i-];
}
dp2[x][d]+=w[x];
for (int i=g[x];i;i=e[i].nxt)
{
int v=e[i].v;
if (v!=fath[x])
dp2[x][d]+=dp1[v][d];
}
for (int i=d-;i>=;i--)
{
int ret=;
for (int j=g[x];j;j=e[j].nxt)
{
int v=e[j].v;
if (v!=fath[x])
ret+=dp1[v][i];
}
dp2[x][i]=dp2[x][i+];
for (int j=g[x];j;j=e[j].nxt)
{
int v=e[j].v;
if (v!=fath[x])
dp2[x][i]=min(dp2[x][i],dp2[v][i+]+ret-dp1[v][i]);
}
}
dp1[x][]=dp2[x][];
for (int i=;i<=d;i++)
dp1[x][i]=min(dp1[x][i],dp1[x][i-]);
for (int i=d-;i>=;i--)
if (!mark[x][i]) dp1[x][i]=min(dp1[x][i],dp1[x][i+]);
dp2[x][]=dp1[x][];
}
int main()
{
scanf("%d%d",&n,&d);
for (int i=;i<=n;i++)
scanf("%d",&w[i]);
scanf("%d",&m);
for (int i=;i<=m;i++)
{
scanf("%d",&x);
mark[x][]=true;
}
for (int i=;i<=n-;i++)
{
scanf("%d%d",&x,&y);
addedge(x,y);addedge(y,x);
}
dp();
printf("%d\n",dp1[][]);
return ;
}
BZOJ 4557 侦查守卫的更多相关文章
- BZOJ 4557 (JLOI 2016) 侦查守卫
4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 493 Solved: 342 [Submit][Status ...
- [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 #2024. 「JLOI / SHOI2016」侦查守卫
#2024. 「JLOI / SHOI2016」侦查守卫 题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...
- JLOI2016 侦查守卫
侦查守卫 小R和B神正在玩一款游戏.这款游戏的地图由 N 个点和 N-1 条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有 N 个节点的树. 游戏中有一种道具叫做侦查守 ...
- BZOJ 4557 JLOI2016 侦查守卫 树形dp
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 题意概述: 给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给 ...
- bzoj4557侦查守卫
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 树形DP.和“河流”有点像,也有一个类似“承诺”的东西. 就是用 f 表示当前节点向下 ...
- BZOJ 4557: [JLoi2016]侦察守卫
题目大意:每个点有一个放置守卫的代价,同时每个点放置守卫能覆盖到的距离都为d,问覆盖所有给定点的代价是多少. 题解: 树形DP f[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上覆盖y层的最 ...
- bzoj4557【JLOI2016】侦查守卫
这道题对于我来说并不是特别简单,还可以. 更新一下blog 树形DP f[i][j]表示i的子树中,最高覆盖到i向下第j层的最小花费. g[i][j]表示i的子树全部覆盖,还能向上覆盖j层的最小花费. ...
随机推荐
- Java 8怎么了之二:函数和原语
[编者按]本文作者为专注于自然语言处理多年的 Pierre-Yves Saumont,Pierre-Yves 著有30多本主讲 Java 软件开发的书籍,自2008开始供职于 Alcatel-Luce ...
- Java script 看看黑客怎么写的
在2011年的BlackHat DC 2011大会上Ryan Barnett给出了一段关于XSS的示例java script 代码: ($=[$=[ ] ] [(__=!$+$)[_=-~-~-~$] ...
- POJ 1969
#include <iostream> #include <cmath> using namespace std; int main() { //freopen("a ...
- 从idea到ipo
**************************************************************************************************** ...
- FZU Problem 2148 Moon Game (判断凸四边形)
题目链接 题意 : 给你n个点,判断能形成多少个凸四边形. 思路 :如果形成凹四边形的话,说明一个点在另外三个点连成的三角形内部,这样,只要判断这个内部的点与另外三个点中每两个点相连组成的三个三角形的 ...
- ExtJs之文本框及数字输入
结合HTML来理解, 比较容易. <!DOCTYPE html> <html> <head> <title>ExtJs</title> &l ...
- UVA 10574 - Counting Rectangles 计数
Given n points on the XY plane, count how many regular rectangles are formed. A rectangle is regular ...
- 微软VSS的超级BUG
发现问题:今天一个新同事,无意中发现他直接就登录进VSS了,并且还是“admin”用户: 解决问题:于是开始在网上找度娘和谷歌帮忙,真是不查不要紧,一查吓一跳,VSS本身就存在这个bug,并且是一个超 ...
- lintcode:整数排序||
题目 给一组整数,按照升序排序.使用归并排序,快速排序,堆排序或者任何其他 O(n log n) 的排序算法. 解题 归并排序 public class Solution { /** * @param ...
- MySQL数据库的基本操作命令
MySQL数据库的基本操作命令 [mysql]mysql 常用建表语句 一.mysql服务操作 net start mysql //启动mysql服务 net stop mysql //停止mysql ...