题面

经典的$cov-unc$树形dp(这词是你自己造的吧=。=)

设$cov[i][j]$表示覆盖完$i$的子树后至少向外再覆盖$j$层的最小代价,$unc[i][j]$表示$i$的子树中还剩下至少$j$层没有覆盖时的最小代价,然后是两个数组的抵消转移什么的

1.边界:对于每个需要覆盖的节点$i$,$unc[i][0]=cov[i][0]=cost_i$,对于不需要覆盖的节点$unc[i][0]=cov[i][0]=0$

而对于每个点$i$,又都有$unc[i][j]=0,cov[i][j]=cost_i(j∈N^*\&\&j<=d)$

2.$cov$的转移

对于每个距离$j$,显然有$cov[i][j]+=unc[goal[i]][j]$(覆盖它当前这个子树)

然后对于距离小于$d$的情况有$cov[i][j]=min(cov[i][j],unc[i][j+1]+cov[goal[i]][j+1])$(子树向外覆盖)

还有我们定义的是“至少”:$cov[i][j]=min(cov[i][j],cov[i][j+1])$

3.$unc$的转移

显然的,有$unc[i][0]=cov[i][0]$

子树的第$i-1$层被覆盖则自己的第$i$层被覆盖,同时也是注意定义里的“最少”:$unc[i][j]=min(unc[i][j]+unc[goal[i]][j-1],unc[i][j-1]$

 #include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=,K=;
int p[N],noww[*N],goal[*N];
int cst[N],imp[N],unc[N][K],cov[N][K];
int n,d,m,t1,t2,cnt,ans=0x3f3f3f3f;
void link(int f,int t)
{
noww[++cnt]=p[f];
goal[cnt]=t,p[f]=cnt;
}
void DFS(int nde,int fth)
{
if(imp[nde]) unc[nde][]=cov[nde][]=cst[nde];
for(int i=;i<=d;i++) cov[nde][i]=cst[nde];
for(int i=p[nde];i;i=noww[i])
if(goal[i]!=fth)
{
DFS(goal[i],nde);
for(int j=d;~j;j--)
{
cov[nde][j]+=unc[goal[i]][j];
if(j<d)
{
cov[nde][j]=min(cov[nde][j],cov[nde][j+]);
cov[nde][j]=min(cov[nde][j],cov[goal[i]][j+]+unc[nde][j+]);
}
}
unc[nde][]=cov[nde][];
for(int j=;j<=d;j++)
unc[nde][j]=min(unc[nde][j]+unc[goal[i]][j-],unc[nde][j-]);
}
}
int main ()
{
scanf("%d%d",&n,&d);
for(int i=;i<=n;i++)
scanf("%d",&cst[i]);
scanf("%d",&m);
for(int i=;i<=m;i++)
scanf("%d",&t1),imp[t1]=true;
for(int i=;i<n;i++)
{
scanf("%d%d",&t1,&t2);
link(t1,t2),link(t2,t1);
}
DFS(,);
for(int i=;i<=d;i++)
ans=min(ans,cov[][i]);
printf("%d",ans);
return ;
}

解题:JLOI 2016 侦查守卫的更多相关文章

  1. BZOJ 4557 (JLOI 2016) 侦查守卫

    4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec Memory Limit: 256 MB Submit: 493 Solved: 342 [Submit][Status ...

  2. loj #2024. 「JLOI / SHOI2016」侦查守卫

    #2024. 「JLOI / SHOI2016」侦查守卫   题目描述 小 R 和 B 神正在玩一款游戏.这款游戏的地图由 nnn 个点和 n−1n - 1n−1 条无向边组成,每条无向边连接两个点, ...

  3. [BZOJ4557][JLOI2016]侦查守卫

    4557: [JLoi2016]侦察守卫 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 297  Solved: 200[Submit][Status ...

  4. JLOI2016 侦查守卫

    侦查守卫 小R和B神正在玩一款游戏.这款游戏的地图由 N 个点和 N-1 条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有 N 个节点的树. 游戏中有一种道具叫做侦查守 ...

  5. 【LOJ】#2024. 「JLOI / SHOI2016」侦查守卫

    题解 童年的回忆! 想当初,这是我考的第一次省选,我当时初二,我什么都不会,然后看着这个东西,是不是能用我一个月前才会的求lca,光这个lca我就调了一个多小时= =,然后整场五个小时,我觉得其他题不 ...

  6. loj2024「JLOI / SHOI2016」侦查守卫

    too hard #include <iostream> #include <cstdio> using namespace std; int n, d, m, uu, vv, ...

  7. 【BZOJ 4561】【JLOI 2016】圆的异或并

    http://www.lydsy.com/JudgeOnline/problem.php?id=4561 一开始并不会做,后来看题解看懂了. 看懂了之后还是错了好几次,数组大小手残开小了. 圆的包含并 ...

  8. BZOJ 4557 侦查守卫

    好迷的树形dp... #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  9. 计数方法(扫描线):JLOI 2016 圆的异或并

    Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面 积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个 ...

随机推荐

  1. C/C++ 下mysql应用封装(连接增删改查)

    mysql - 初始化 1) mysql_init():初始化数据库 2) mysql_real_connect()(不推荐用Mysql_connect()):连接数据库 详细代码如下: bool d ...

  2. 【转】AOE机制的DSL及其实际运用

    AOE这个词的意思,我相信玩过WOW的人都不陌生,包括玩过LoL的也不会陌生,说穿了就是一个区域内发生效果(Area of effect).这里我们要讨论的就是关于一个适合于几乎所有游戏的AOE机制, ...

  3. 后端编程语言PHP

    | 版权声明:本文为博主原创文章,未经博主允许不得转载. 一.PHP 简介 PHP 是一种创建动态交互性站点的强有力的服务器端脚本语言. PHP 脚本在服务器上执行. 什么是 PHP?(超文本预处理器 ...

  4. USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

  5. Scrum立会报告+燃尽图 03

    此作业要求:[https://edu.cnblogs.com/campus/nenu/2018fall/homework/2190] 一.小组介绍 组长:王一可 组员:范靖旋,王硕,赵佳璐,范洪达,祁 ...

  6. 20162328蔡文琛 week06 大二

    20162328 2017-2018-1 <程序设计与数据结构>第6周学习总结 教材学习内容总结 队列元素按FIFO的方式处理----最先进入的元素最先离开. 队列是保存重复编码k值得一种 ...

  7. ncnblogs.com的用户体验

    你是什么样的用户, 有什么样的心理, 对cnblogs 的期望值是什么? 我是一名普通的学生,上cnblogs的期望是发表博客完成老师布置的任务. 当你第一次使用cnblogs 的功能的时候, 碰到了 ...

  8. Pyhont:内建函数enumerate

    1.enumerate的中文意思 2.enumerate参数为可遍历的变量,如字符串.列表等,其返回值为enumerate类. 3.enumerate多用在for循环中得到计数 . [注]:若在for ...

  9. ASP.NET MVC5 学习系列之模型绑定

    一.理解 Model Binding Model Binding(模型绑定) 是 HTTP 请求和 Action 方法之间的桥梁,它根据 Action 方法中的 Model 类型创建 .NET 对象, ...

  10. lintcode-408-二进制求和

    408-二进制求和 给定两个二进制字符串,返回他们的和(用二进制表示). 样例 a = 11 b = 1 返回 100 标签 二进制 字符串处理 脸书 思路 先相加,在处理进位,为了方便操作,将选字符 ...