题面

经典的$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. Python小白学习之基础知识(个人笔记)

    介绍while else的使用,这个不常用 格式化输出 while esle ,当循环内有break语句时,不执行else语句,当没有break语句时,执行完while循环,然后执行else下面的语句 ...

  2. 【转】glumer Appium + Python环境搭建(移动端自动化)

    最近整理了一下自动化的东西,好久没搭建环境又踩了不少坑,appium的环境搭建比较繁琐,好多同行估计都在环境上被卡死了.分享一下~~ 一.安装JDK,配置JDK环境    百度搜索下载就行,这里分享一 ...

  3. sql server 批量备份数据库

    很多时候,我们都需要将数据库进行备份,当服务器上数据库较多时,不可能一个数据库创建一个定时任务进行备份,这时,就需要进行批量的数据库备份操作,好了,废话不多说,具体实现语句如下: --开启文件夹权限 ...

  4. Hyperledger Fabric 1.0 从零开始(十三)——orderer分布式方案

    简述 在搭建HyperLedger Fabric环境的过程中,我们会用到一个configtx.yaml文件(可参考Hyperledger Fabric 1.0 从零开始(八)——Fabric多节点集群 ...

  5. MacOS下安装BeautifulSoup库及使用

    BeautifulSoup简介 BeautifulSoup库是一个强大的python第三方库,它可以解析html进行解析,并提取信息. 安装BeautifulSoup 打开终端,输入命令: pip3 ...

  6. jQuery之回到顶部

    实现回到顶部的功能,根据学了元素滚动实现,温习知识点. 做之前先理清一下步骤和思路: 1.获得页面的滚动长度 var $page = $("html,body"); var dis ...

  7. 《高性能JavaScript》学习笔记——日更中

    ------------------2016-7-20更------------------ 最近在看<高性能JavaScript>一书,里面当中,有讲很多提高js性能的书,正在看的过程中 ...

  8. java分页算法

    int totalPageNum = (totalRecord  +  pageSize  - 1) / pageSize;

  9. 利用SSH secure Shell实现windows与linux之间传输文件

    在windows下安装SSH secure Shell.默认安装后有两个快捷方式. linux下需要安装openssh-server utuntu默认安装了opens是-client,所以不需要安装, ...

  10. HDU4646_Laser Beam

    题目是这样的,一个等边三角形,三边都是有镜子组成的. 现在要你从一个点射入一条光线,问你如果要求光线在三角形里面反射n次然后从入点射出来的话,入射的方向可能有多少种? 这.....其实不难.关键是要搞 ...