题目描述

  小$w$心里的火焰就要被熄灭了。
  简便起见,假设小$w$的内心是一棵$n-1$条边,$n$个节点的树。
  现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个。
  接下来每个节点都要被分配给一个至多$k$条边远的灭火器,每个灭火器最多能分配给$s$个节点。
  至少要多少个灭火器才能让小$w$彻底死心呢?


输入格式

  第一行三个整数$n,s,k$。
  接下来$n-1$行每行两个整数表示一条边。


输出格式

  一行一个整数表示答案


样例

样例输入:

10 10 3
1 8
2 3
1 5
2 4
1 2
8 9
8 10
5 6
5 7

样例输出:

1


数据范围与提示

  对于$20\%$的数据满足$n\leqslant 100,k\leqslant 2$。
  对于另外$20\%$的数据满足$k=1$。
  对于另外$20\%$的数据满足$s=1$。
  对于$100\%$的数据满足$n\leqslant 10^5,k\leqslant 20,s\leqslant 10^9$。


题解

先来考虑贪心,依次选还没有被覆盖的深度最大的点一定更优,这个用一个堆维护就好啦。

但是可能存在灭火器交集很大的情况。

再来考虑$DP$,设$G[x][k]$表示$x$下面距离为$k$的需要灭火器的房间数,$F[x][k]$表示$x$下面距离为$k$的多余灭火器数。

首先$G[x][k]$要与$F[x][0]$匹配。

还要注意可以跨国$LCA$,所以$G[x][i]$也可以与$F[x][k-i]$匹配,$G[x][i]$与$F[x][k-i-1]$匹配。

那么有转移:

$$F[u][i]=\sum\limits_vF[v][i-1]$$

$$G[u][i]=\sum\limits_vG[v][i+1]$$

初始化$F[x][i]=G[x][i]=1$即可。

匹配的时候用指针维护就好了。

时间复杂度:$\Theta(nk)$。

期望得分:$100$分。

实际得分:$100$分。


代码时刻

#include<bits/stdc++.h>
using namespace std;
struct rec{int nxt,to;}e[200000];
int head[100001],cnt;
int n,s,k;
int f[100001][21],g[100001][21];
bool vis[100001];
int ans,sum;
void add(int x,int y)
{
e[++cnt].nxt=head[x];
e[cnt].to=y;
head[x]=cnt;
}
void dfs(int x)
{
vis[x]=1;
for(int i=head[x];i;i=e[i].nxt)
{
if(vis[e[i].to])continue;
dfs(e[i].to);
for(int j=1;j<=k;j++)
{
f[x][j]+=f[e[i].to][j-1];
g[x][j-1]+=g[e[i].to][j];
g[x][j-1]=min(g[x][j-1],n);
}
}
f[x][0]++;
if(f[x][k])
{
int tmp=(ceil)((double)f[x][k]/s);
ans+=tmp;
g[x][k]+=min(tmp*s,n)-f[x][k];
f[x][k]=0;
}
int fail=k;
for(int i=k;~i;i--)
while(f[x][i]&&fail>=i)
{
int flag=min(f[x][i],g[x][fail]);
f[x][i]-=flag;g[x][fail]-=flag;
if(!g[x][fail])fail--;
}
}
int main()
{
scanf("%d%d%d",&n,&s,&k);
for(int i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
add(x,y);add(y,x);
}
dfs(1);
for(int i=0;i<=k;i++)sum+=f[1][i];
ans+=(ceil)((double)sum/s);
printf("%d",ans);
return 0;
}

rp++

[JZOJ5400]:Repulsed(贪心+树形DP)的更多相关文章

  1. 联赛模拟测试25 C. Repulsed 贪心+树形DP

    题目描述 分析 考虑自底向上贪心 \(f[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的需要灭火器的房间数,\(g[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的多余灭火器 ...

  2. bzoj 1907: 树的路径覆盖【贪心+树形dp】

    我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...

  3. CSP模拟赛 Repulsed(树形DP)

    题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ...

  4. 【模拟8.11】将军令(贪心&&树形DP)

    只看45分的话,是树形DP....(当然也有能拿到70分+的大佬) 40分: 只考虑k==1的情况,树形DP 所以每个节点可能被父亲,自己,儿子控制 设f[MAXN][3],0表示儿子,1表示自己,2 ...

  5. BZOJ 4027:[HEOI2015]兔子与樱花(贪心+树形DP)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=4027 [题目大意] 樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1 ...

  6. P2279 [HNOI2003]消防局的设立 贪心or树形dp

    题目描述 2020年,人类在火星上建立了一个庞大的基地群,总共有n个基地.起初为了节约材料,人类只修建了n-1条道路来连接这些基地,并且每两个基地都能够通过道路到达,所以所有的基地形成了一个巨大的树状 ...

  7. CF 463A && 463B 贪心 && 463C 霍夫曼树 && 463D 树形dp && 463E 线段树

    http://codeforces.com/contest/462 A:Appleman and Easy Task 要求是否全部的字符都挨着偶数个'o' #include <cstdio> ...

  8. 【bzoj4027】[HEOI2015]兔子与樱花 树形dp+贪心

    题目描述 很久很久之前,森林里住着一群兔子.有一天,兔子们突然决定要去看樱花.兔子们所在森林里的樱花树很特殊.樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它 ...

  9. 51nod 1812 树的双直径 题解【树形DP】【贪心】

    老了-稍微麻烦一点的树形DP都想不到了. 题目描述 给定一棵树,边权是整数 \(c_i\) ,找出两条不相交的链(没有公共点),使得链长的乘积最大(链长定义为这条链上所有边的权值之和,如果这条链只有 ...

随机推荐

  1. python numpy 的用法——diag函数

    当 np.diag(array) 中 array是一个1维数组时,结果形成一个以一维数组为对角线元素的矩阵 array是一个二维矩阵时,结果输出矩阵的对角线元素

  2. vue入门:(底层渲染实现render函数、实例生命周期)

    vue实例渲染的底层实现 vue实例生命周期 一.vue实例渲染的底层实现 1.1实例挂载 在vue中实例挂载有两种方法:第一种在实例化vue时以el属性实现,第二种是通过vue.$mount()方法 ...

  3. eclipse中svn从分支合并到主干及冲突解决

    https://blog.csdn.net/shengqianfeng/article/details/79203156

  4. JavaJDBC【五、事务】

    概念: 事务(Transaction)作为单个逻辑工作单元执行的一系列操作. 这些操作都是作为一个整体一起向系统提交,要么都执行,要么都不执行. 特点: 原子性:一个完整操作. 一致性:当事务完成时, ...

  5. NORDIC 修改MTU

    https://www.cnblogs.com/jiangjiu/p/10063556.html 注意要修改RAM起始地址,因为MTU增大了

  6. PAT1005 继续(3n+1)猜想

    卡拉兹(Callatz)猜想已经在1001中给出了描述.在这个题目里,情况稍微有些复杂. 当我们验证卡拉兹猜想的时候,为了避免重复计算,可以记录下递推过程中遇到的每一个数.例如对 n=3 进行验证的时 ...

  7. 延长zencart1.5.x后台的15分钟登录时间和取消90天强制更换密码

    延长zencart1.5.x后台的15分钟登录时间 打开includes\functions\sessions.php if (IS_ADMIN_FLAG === true) { if (!$SESS ...

  8. python+Appium自动化:id元素定位

    元素定位 与web自动化一样,app自动化元素定位也是非常重要的一环,,appium也是提供了很多元素定位的方法,比如:id.name.class.层级定位等等. 元素定位方式 id name cla ...

  9. 第六章 组件 61 动画-小球动画flag标识符的作用分析

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8&quo ...

  10. python+request+HTMLTestRunner+unittest接口自动化测试框架

    转自https://my.oschina.net/u/3041656/blog/820023 正在调研使用python进行自动化测试,在网上发现一篇比较好的博文,作者使用的是python3,但目前自己 ...