4557: [JLoi2016]侦察守卫】的更多相关文章

bzoj 4557: [JLoi2016]侦察守卫 设f[x][j]表示覆盖以x为根的子树的所有应该被覆盖的节点,并且以x为根的子树向下j层全部被覆盖的最小代价. 设g[x][j]表示与x距离大于j全部应该覆盖的节点全部被覆盖的最小代价. 有 f[u][j] = min{f[u][j]+g[v][j],g[u][j+1]+f[v][j+1],f[u][j+1]} g[u][j] = min{g[u][j-1],g[u][j]+g[v][j-1]} 边界f[u][d+1] = inf;f[u][i…
4557: [JLoi2016]侦察守卫 链接 分析: 因为D比较小,所设状态f[i][j]表示子树i内,从i往下第j层及第j层以下都覆盖了的最小代价,g[i][j]表示覆盖完子树内所有点,还可以往上覆盖j层的最小花费. g的转移从子树内转移的时候,可以覆盖其他子树内的点, f数组直接求和即可. 最后要对g维护一下后缀最小值,对i维护前缀最小值.因为往上覆盖i+1的,一定可以更新往上覆盖i层的:往下有i层未覆盖的,一定可以更新往下有i-1层未覆盖的. 代码: #include<cstdio>…
题目大意:每个点有一个放置守卫的代价,同时每个点放置守卫能覆盖到的距离都为d,问覆盖所有给定点的代价是多少. 题解: 树形DP f[x][y]表示x子树中所有点都已经覆盖完,并且x还能向上覆盖y层的最小代价.g[x][y]表示x的y层及以下的所有点都已经覆盖完,还需要覆盖上面的y层的最小代价. 代码: #include<cstdio> #include<algorithm> using namespace std; int n,d,cnt,m,last[1000005],f[100…
设f[u][i]为u点向下覆盖至少i层并且处理完u的子树的最小代价,f[u][i]为u点向上覆盖至少i层并且处理完u的子树的最小代价 转移的话显然f[u][i]+=f[v][i-1],但是f[u][0]不好确定,可以知道f[u][0]=g[u][0],而g的转移是g[u][j]=min(g[u][j]+f[e[i].to][j],f[u][j+1]+g[e[i].to][j+1]),所以就可以求了 #include<iostream> #include<cstdio> using…
BZOJ4557 JLoi2016 侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树.游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦查守卫后,它可以监视这个点以及与这个点的距离在D以内的所有点.这里两个点之间的距离定义为它们在树上的距离,也就是两个点之间唯一的简单路径上所经过边的条数.在一个点上放置侦查守卫需要付出一定的代价,在不同点放置守卫的代价可能不…
[BZOJ4557][JLoi2016]侦察守卫 Description 小R和B神正在玩一款游戏.这款游戏的地图由N个点和N-1条无向边组成,每条无向边连接两个点,且地图是连通的.换句话说,游戏的地图是一棵有N个节点的树.游戏中有一种道具叫做侦查守卫,当一名玩家在一个点上放置侦查守卫后,它可以监视这个点以及与这个点的距离在D以内的所有点.这里两个点之间的距离定义为它们在树上的距离,也就是两个点之间唯一的简单路径上所经过边的条数.在一个点上放置侦查守卫需要付出一定的代价,在不同点放置守卫的代价可…
http://www.lydsy.com/JudgeOnline/problem.php?id=4557 假设当前到了x的子树,现在是合并 x的第k个子树 f[x][j] 表示x的前k-1个子树该覆盖的完全覆盖,而且还能向上覆盖j层的最小代价 这个向上是针对x来说的,即可以向x的祖先方向再覆盖j层 对于第k个子树的意义就是,兄弟子树放置的守卫可以帮x的第k个子树覆盖前j层(第1层为x的子节点) 那么相应的就要有一个状态来表示这个 可以让兄弟子树 帮忙覆盖 的前j层 g[x][j] 表示还需要覆盖…
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 题意概述: 给出一棵树,每个点付出代价w[i]可以控制距离和它不超过d的点,现在给出一些点,问控制这些点的最小代价是多少. 分析: 观察一下数据范围发现算算法的复杂度可能和d有关.横看竖看这像是一个树形dp,所以我们就把d搞到状态方程里面去嘛怎么就完全没有想到呢...... 既然要用树形dp,就要先分析一下性质. 一个点如果被选择成为控制点,那么它可以控制的点有:子树中深度不超过…
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=4557 见这位的博客:https://www.cnblogs.com/Narh/p/9140326.html 代码如下: #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef long long ll; ,inf=1e9; ll w[maxn],f[max…
首先可以确定是树形DP,但这里存在跨子树的信息传递问题,这里就需要“借”的思想. f[i][j]表示i子树内所有点都被覆盖到,且i以外j层内的点都能被覆盖到 的方案数. g[i][j]表示i子树内离i距离不小于j的点都被覆盖到 的方案数. 这里f做了一个前缀和,g做了一个后缀和. 那么f有转移: 1.目前以x为根的子树还有点没被覆盖到,让新加的y子树内的守卫来覆盖. f[x][j]=g[x][j+1]+f[k][j+1] 2.目前x子树以完全覆盖,那么允许y子树存在未覆盖的点. f[x][j]=…