p3267 [JLOI2016/SHOI2016]侦察守卫

分析

g[x][i]表示x点向上i条边的所有关键点都被覆盖的代价

f[x][i]表示x点向下i条边有关键点未被覆盖的代价

转移即可

代码

#include<bits/stdc++.h>
using namespace std;
const int inf = 1e9+7;
int n,m,d,w[500100],is[500100],f[500100][22],g[500100][22];
vector<int>v[500100];
inline void dfs(int x,int fa){
    if(is[x])f[x][0]=g[x][0]=w[x];
    for(int i=1;i<=d;i++)g[x][i]=w[x];
    g[x][d+1]=inf;
    for(int i=0;i<v[x].size();i++)
      if(v[x][i]!=fa){
          dfs(v[x][i],x);
          for(int j=0;j<=d;j++)g[x][j]=min(g[x][j]+f[v[x][i]][j],f[x][j+1]+g[v[x][i]][j+1]);
          for(int j=d;j>=0;j--)g[x][j]=min(g[x][j],g[x][j+1]);
          f[x][0]=g[x][0];
          for(int j=1;j<=d;j++)f[x][j]+=f[v[x][i]][j-1];
          for(int j=1;j<=d;j++)f[x][j]=min(f[x][j],f[x][j-1]);
      }
    return;
}
int main(){
    int i,j,k;
    scanf("%d%d",&n,&d);
    for(i=1;i<=n;i++)scanf("%d",&w[i]);
    scanf("%d",&m);
    for(i=1;i<=m;i++){
      int x;
      scanf("%d",&x);
      is[x]=1;
    }
    for(i=1;i<n;i++){
      int x,y;
      scanf("%d%d",&x,&y);
      v[x].push_back(y);
      v[y].push_back(x);
    }
    dfs(1,0);
    printf("%d\n",g[1][0]);
    return 0;
}

原文地址:https://www.cnblogs.com/yzxverygood/p/11519082.html

时间: 2024-12-23 21:30:22

p3267 [JLOI2016/SHOI2016]侦察守卫的相关文章

[JLOI2016/SHOI2016]侦察守卫(树形dp)

小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树. 游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦查守卫后,它可以监视这个点以及与这个点的距离在D以内的所有点.这里两个点之间的距离定义为它们在树上的距离,也就是两个点之间唯一的简单路径上所经过边的条数.在一个点上放置侦查守卫需要付出一定的代价,在不同点放置守卫的代价可能不同. 现在小R知道了所有B神可能会出现的位置,请你计算监视所有这些位

一类树上问题的总结

有时,我们会遇到这样的问题: 在一个树上选定一些点,每个点能覆盖一定范围的点--之类 比如: CF70E Information Reform P4845 LJJ爱数树 P3267 [JLOI2016/SHOI2016]侦察守卫 通常,我们有两种做法: 方法一:我们对于每个点,考虑距离它最近的被选点 需要先证明一个显然的结论:对于每个i,以i为最近点的j是一个连通块. 换句话说,如果距离a的最近被选点为i,距离b的最近被选点也是i,那么a到b的路径上的点的最近被选点都是i. 考虑一条链:设Ax是

4557: [JLoi2016]侦察守卫 树形dp

一道好题,但也是一道水题. 可怜yyl蒟蒻看了别人怎么开数组后还是不会写. orz各位大神. 接下来上大神的题解(注意不是我的): 比较简单的一个DPf[i][j]表示节点为i的子树向下j层以下需要被覆盖的节点已经被覆盖了的答案g[i][j]表示节点为i的子树,子树内需要被覆盖的几点已经被覆盖了,还可以向上覆盖j层的答案f[i][0]=g[i][0]然后正着反着取两遍最小值即可 接着yy应该可以出来了.感觉不难.就是想不到…………………….too young too simple 1 #incl

BZOJ4557 [JLoi2016]侦察守卫 【树形dp】

题目链接 BZOJ4557 题解 orz 比较难的树形dp 不过想想也还好 看数据猜状态,一维是点,一维是D 那么就先设\(f[i][j]\)表示\(i\)所在子树已处理完毕,还能向上[或向任意方向]覆盖\(j\)层的最小代价 考虑转移,会发现子树间会相互影响,一个子树用\(f[s][j + 1]\)更新了\(f[i][j]\),其它的子树就完全没必要再用\(f[s'][j + 1]\)去更新了,此时反而可以用\(f[i][j]\)来减少该子树付出的代价 所以我们设一个\(g[i][j]\)表示

BZOJ 4596: [Shoi2016]黑暗前的幻想乡

4596: [Shoi2016]黑暗前的幻想乡 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 408  Solved: 232[Submit][Status][Discuss] Description 四年一度的幻想乡大选开始了,最近幻想乡最大的问题是很多来历不明的妖 怪涌入了幻想乡,扰乱了幻想乡昔日的秩序.但是幻想乡的建制派妖怪(人类) 博丽灵梦和八云紫等人整日高谈所有妖怪平等,幻想乡多元化等等,对于幻想乡 目前面临的种种大问题却给不出合适的解

SHOI2016游记&amp;滚粗记&amp;酱油记

Day0 学校刚期中考完,全科血崩,感觉这次真要考不到一本线了tat 晚上写了个可持久化trie的题,也懒得敲板子(上个礼拜都敲过了),就碎叫了 Day1 上午起床吃饭水群看球,吃完中饭就去考场了. 下雨,路上花了挺长时间,到的挺晚的.然后就开考了. 这次和LN.JL是同一套卷子,感觉丢脸要丢到外省去了啊TAT 看题,T1是一棵树,然后可以插眼啥的题,求最小费用.感觉一脸可做啊,应该是树DP,感觉做过类似的题? 不过决定先看完题目.然后再看T2,网格图挖点求正方形个数,这怎么做啊qaq 然后再看

bzoj4559【JLOI2016】成绩比较

4559: [JLoi2016]成绩比较 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 37  Solved: 29 [Submit][Status][Discuss] Description G系共有n位同学,M门必修课.这N位同学的编号为0到N-1的整数,其中B神的编号为0号.这M门必修课编号为0到M- 1的整数.一位同学在必修课上可以获得的分数是1到Ui中的一个整数.如果在每门课上A获得的成绩均小于等于B获 得的成绩,则称A被B碾压.在B

bzoj4558【JLOI2016】方

4558: [JLoi2016]方 Time Limit: 20 Sec  Memory Limit: 256 MB Submit: 185  Solved: 78 [Submit][Status][Discuss] Description 上帝说,不要圆,要方,于是便有了这道题.由于我们应该方,而且最好能够尽量方,所以上帝派我们来找正方形 上帝把我们派到了一个有N行M列的方格图上,图上一共有(N+1)×(M+1)个格点,我们需要做的就是找出这些格点形 成了多少个正方形(换句话说,正方形的四个顶

【BZOJ4561】[JLoi2016]圆的异或并 扫描线

[BZOJ4561][JLoi2016]圆的异或并 Description 在平面直角坐标系中给定N个圆.已知这些圆两两没有交点,即两圆的关系只存在相离和包含.求这些圆的异或面积并.异或面积并为:当一片区域在奇数个圆内则计算其面积,当一片区域在偶数个圆内则不考虑. Input 第一行包含一个正整数N,代表圆的个数.接下来N行,每行3个非负整数x,y,r,表示一个圆心在(x,y),半径为r的圆.保证|x|,|y|,≤10^8,r>0,N<=200000 Output 仅一行一个整数,表示所有圆的