联赛模拟测试25 C. Repulsed 贪心+树形DP
题目描述


分析
考虑自底向上贪心
\(f[x][k]\) 表示 \(x\) 下面距离为 \(k\) 的需要灭火器的房间数,\(g[x][k]\)
表示 \(x\) 下面距离为 \(k\) 的多余灭火器数
每个灭火器和房间的匹配在 \(lca\) 处处理
每次假设子树里已经最优了,那么 \(f[x][k]\) 一定要用 \(g[x][0]\)
填满
然后距离为 \(k\) 的一定会在 \(x\) 处匹配掉,否则到上面不会更
优(可以交叉互换)
在不存在距离为 \(k\) 的前提下,\(k-1\) 一定会在 \(x\) 处匹配掉否则
可以交叉互换
根处 \(g\) 和 \(f\) 的匹配再做一个简单的贪心即可
代码
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define rg register
inline int read(){
rg int x=0,fh=1;
rg char ch=getchar();
while(ch<'0' || ch>'9'){
if(ch=='-') fh=-1;
ch=getchar();
}
while(ch>='0' && ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*fh;
}
const int maxn=1e5+5,maxk=22;
int h[maxn],tot=1,n,s,k;
struct asd{
int to,nxt;
}b[maxn<<1];
void ad(int aa,int bb){
b[tot].to=bb;
b[tot].nxt=h[aa];
h[aa]=tot++;
}
int f[maxn][maxk],g[maxn][maxk],siz[maxn],ans;
void dfs(int now,int fa){
f[now][0]++;
for(rg int i=h[now];i!=-1;i=b[i].nxt){
rg int u=b[i].to;
if(u==fa) continue;
dfs(u,now);
for(rg int j=0;j<k;j++){
f[now][j+1]+=f[u][j];
g[now][j+1]+=g[u][j];
if(g[now][j+1]>n) g[now][j+1]=n;
}
}
while(f[now][k] && g[now][0]<f[now][k]){
g[now][0]+=s;
ans++;
}
for(rg int i=0;i<=k;i++){
rg int cs=std::min(f[now][k-i],g[now][i]);
f[now][k-i]-=cs;
g[now][i]-=cs;
}
for(rg int i=0;i<k;i++){
rg int cs=std::min(f[now][k-i-1],g[now][i]);
f[now][k-i-1]-=cs;
g[now][i]-=cs;
}
}
int main(){
memset(h,-1,sizeof(h));
n=read(),s=read(),k=read();
rg int aa,bb;
for(rg int i=1;i<n;i++){
aa=read(),bb=read();
ad(aa,bb);
ad(bb,aa);
}
dfs(1,0);
for(rg int i=0;i<=k;i++){
for(rg int j=k-i;j>=0;j--){
rg int cs=std::min(f[1][j],g[1][i]);
f[1][j]-=cs;
g[1][i]-=cs;
}
}
rg int nans=0;
for(rg int i=0;i<=k;i++){
nans+=f[1][i];
}
if(nans%s==0) ans+=nans/s;
else ans+=nans/s+1;
printf("%d\n",ans);
return 0;
}
联赛模拟测试25 C. Repulsed 贪心+树形DP的更多相关文章
- bzoj 1907: 树的路径覆盖【贪心+树形dp】
我是在在做网络流最小路径覆盖的时候找到这道题的 然后发现是个贪心+树形dp \( f[i] \)表示在\( i \)为根的子树中最少有几条链,\( v[i] \) 表示在\( i \)为根的子树中\( ...
- CSP模拟赛 Repulsed(树形DP)
题面 ⼩ w ⼼⾥的⽕焰就要被熄灭了. 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树. 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个. 接下来每个节点都要被分配给 ...
- 【模拟8.11】将军令(贪心&&树形DP)
只看45分的话,是树形DP....(当然也有能拿到70分+的大佬) 40分: 只考虑k==1的情况,树形DP 所以每个节点可能被父亲,自己,儿子控制 设f[MAXN][3],0表示儿子,1表示自己,2 ...
- [NOIP10.3模拟赛]3.w题解--神奇树形DP
题目链接: 咕 闲扯: 这题考场上把子任务都敲满了,5个namespace,400行11k 结果爆0了哈哈,因为写了个假快读只能读入一位数,所以手测数据都过了,交上去全TLE了 把边分成三类:0. 需 ...
- [20190727NOIP模拟测试9]单(single) 题解(树上dp)
啊啊啊啊啊啊啊啊考场上差一点就A掉了5555 千里之堤溃于蚁穴……鬼知道最后一步那么显然的柿子我为什么没考虑用上…… 观察数据范围可知,出题人期望我们想出一个$O(n)$的做法 当然也有可能是$O(n ...
- NOIP模拟测试2-5
该补一下以前挖的坑了 先总结一下 第二次 T1 搜索+剪枝 #include<cstdio> #include<iostream> #define ll long long u ...
- [CSP-S模拟测试]:C(三分+贪心)
题目传送门(内部题46) 输入格式 第一行$3$个整数$n,m,t$.第二行$n$个整数,表示$P_i$.接下来$m$行每行两个整数,表示$L_i,R_i$. 输出格式 一行一个整数表示答案. 样例 ...
- [JZOJ5400]:Repulsed(贪心+树形DP)
题目描述 小$w$心里的火焰就要被熄灭了. 简便起见,假设小$w$的内心是一棵$n-1$条边,$n$个节点的树. 现在你要在每个节点里放一些个灭火器,每个节点可以放任意多个. 接下来每个节点都要被分配 ...
- [CSP-S模拟测试]:括号密码(贪心)
题目描述 在“无限神机”的核心上,有一个奇怪的括号密码,密码初始已经有一个括号序列,有$n$个限制条件,每个限制条件描述为$l_i$和$r_i$,表示区间$[l_i,r_i]$的括号序列必须合法.调整 ...
随机推荐
- 基于docker部署jenkins
1. 拉镜像 和其他的部署的镜像的方式一样,通常是直接使用docker search jenkins 然后直接docker pull jenkins 此时,在安装插件的时候发现插件都安装失败,提示je ...
- linux 上部署 YApi 可视化接口管理平台
linux 上部署 YApi 可视化接口管理平台: YApi 是一个高效.易用.功能强大的可视化接口管理平台,官方地址 : http://yapi.demo.qunar.com/ 环境要求 nodej ...
- Python3.8下载安装步骤及环境变量配置详解
安装地址:https://www.python.org/ 打开python官网网址,点击 Python 3.8.5 3.下载与自己电脑系统相匹配的版本(这里以64为例) 点击下载完成后打开文件运行 点 ...
- Vue常用指令详解分析
Vue入门 Vue是一个MVVM(Model / View / ViewModel)的前端框架,相对于Angular来说简单.易学上手快,近两年也也别流行,发展速度较快,已经超越Angular了.比较 ...
- 推荐条+fragment
主布局 package com.example.dell.day1215; import android.support.design.widget.TabLayout; import android ...
- Python-信号量和线程池-semaphore ThreadPollExector
信号量 其实本质上是锁,Lock是单锁,信号量是指定多把锁,也就是说通过信号量指定多个数线程可以访问相同资源,一般情况下读操作可以有多个,但写操作同时只有一个 信号量模块 semaphore # 使用 ...
- mysql-17-procedure
#存储过程 /* 一组预先编译好的sql语句集合,理解成批处理语句 好处: 1.提高代码重用性 2.简化操作 3.减少了编译次数并减少了和数据库服务器的连接次数,提高了效率 */ #一.创建 /* c ...
- 软件定义网络实验记录⑤--OpenFlow 协议分析和 OpenDaylight 安装
一.实验目的 回顾 JDK 安装配置,了解 OpenDaylight 控制的安装,以及 Mininet 如何连接: 通过抓包获取 OpenFlow 协议,验证 OpenFlow 协议和版本,了解协议内 ...
- Espruino似乎和Arduino一样
参考:https://baike.baidu.com/item/Espruino Espruino 编辑 锁定 讨论 Espruino 是一个微处理器的 JavaScript 解释器,我们用它来创 ...
- node将js中的json对象生成到新的excel表中
第一步 安装依赖包 npm install json2xls fs 第二步 创建node.js文件,文件内代码如下: var fs = require('fs'); var path = re ...