CSP模拟赛 Repulsed(树形DP)
题面
⼩ w ⼼⾥的⽕焰就要被熄灭了。 简便起⻅,假设⼩ w 的内⼼是⼀棵 n − 1 条边,n 个节点的树。 现在你要在每个节点⾥放⼀些个灭⽕器,每个节点可以放任意多个。 接下来每个节点都要被分配给⼀个⾄多 k 条边远的灭⽕器,每个灭⽕器最多能分配给 s 个节 点。 ⾄少要多少个灭⽕器才能让⼩ w 彻底死⼼呢?
题解
树形DP,由于k≤20k\le 20k≤20,用f[i][j]f[i][j]f[i][j]存iii这个点下面距离为jjj的未匹配点有多少个,g[i][j]g[i][j]g[i][j]存iii下面能够再往上拓展jjj长度的灭火器分配数量(一个灭火器提供sss的数量)。那么根据贪心,肯定是f[i][k]f[i][k]f[i][k]必须在iii处放灭火器,然后剩下的能配就配,因为如果可以,在下面配显然更优。
时间复杂度O(nk)O(nk)O(nk)。
CODE
#include <bits/stdc++.h>
using namespace std;
inline void rd(int &x) {
char ch; while(!isdigit(ch=getchar()));
for(x=ch-'0';isdigit(ch=getchar());x=x*10+ch-'0');
}
const int MAXN = 100005;
const int MAXK = 25;
int n, s, k, ans;
int fir[MAXN], to[MAXN<<1], nxt[MAXN<<1], cnt;
inline void link(int u, int v) {
to[++cnt] = v; nxt[cnt] = fir[u]; fir[u] = cnt;
to[++cnt] = u; nxt[cnt] = fir[v]; fir[v] = cnt;
}
int f[MAXN][MAXK], g[MAXN][MAXK];
void dfs(int u, int ff) {
for(int i = fir[u], v; i; i = nxt[i])
if((v=to[i]) != ff) {
dfs(v, u);
for(int j = 0; j < k; ++j) f[u][j+1] += f[v][j];
for(int j = 1; j <= k; ++j) g[u][j-1] += g[v][j], g[u][j-1] = min(g[u][j-1], n);
//此处g可能加爆int 我就因为这里考试爆了10分(没能akQAQ)
}
++f[u][0];
if(f[u][k]) {
int need = (f[u][k]+s-1) / s;
ans += need;
g[u][k] += min(1ll*need*s, 1ll*n) - f[u][k];
f[u][k] = 0;
}
int tmp, cur = k;
for(int i = k; i >= 0; --i) {
while(f[u][i] && cur >= i) {
tmp = min(f[u][i], g[u][cur]);
f[u][i] -= tmp, g[u][cur] -= tmp;
if(!g[u][cur]) --cur;
}
}
}
int main () {
rd(n), rd(s), rd(k);
for(int i = 1, u, v; i < n; ++i) rd(u), rd(v), link(u, v);
dfs(1, 0);
int sum = 0;
for(int i = 0; i <= k; ++i) sum += f[1][i];
printf("%d\n", ans + (sum + s-1) / s);
}
CSP模拟赛 Repulsed(树形DP)的更多相关文章
- 5.10 省选模拟赛 tree 树形dp 逆元
LINK:tree 整场比赛看起来最不可做 确是最简单的题目. 感觉很难写 不过单独考虑某个点 容易想到树形dp的状态. 设f[x]表示以x为根的子树内有黑边的方案数. 白边方案只有一种所以不用记录. ...
- 4.13 省选模拟赛 树 树形dp 卷积 NTT优化dp.
考试的时候 看到概率 看到期望我就怂 推了一波矩阵树推自闭了 发现 边权点权的什么也不是. 想到了树形dp 维护所有边的断开情况 然后发现数联通块的和再k次方过于困难. 这个时候 应该仔细观察一下 和 ...
- CSP模拟赛 Matrix(DP)
题面 求出满足以下条件的 n*m 的 01 矩阵个数: (1)第 i 行第 1~li 列恰好有 1 个 1. (2)第 i 行第 ri~m 列恰好有 1 个 1. (3)每列至多有 1 个 1. n, ...
- BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP
题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...
- 【JZOJ5071】【GDSOI2017第二轮模拟】奶酪 树形dp
题面 CJY很喜欢吃奶酪,于是YJC弄到了一些奶酪,现在YJC决定和CJY分享奶酪. YJC弄到了n-1块奶酪,于是他把奶酪挂在了一棵n个结点的树上,每根树枝上挂一块奶酪,每块奶酪都有重量. YJC和 ...
- CSP模拟赛游记
时间:2019.10.5 考试时间:100分钟(连正式考试时间的一半还没有到)题目:由于某些原因不能公开. 由于第一次接触NOIinux系统所以连怎么建文件夹,调字体,如何编译都不知道,考试的前半小时 ...
- 【CSP模拟赛】Adore(状压dp 二进制)
题目描述 小w偶然间见到了一个DAG.这个DAG有m层,第一层只有一个源点,最后一层只有一个汇点,剩下的每一层都有k个节点.现在小w每次可以取反第i(1<i<n-1)层和第i+1层之间的连 ...
- CSP模拟赛 number (二分+数位DP)
题面 给定整数m,km,km,k,求出最小和最大的正整数 nnn 使得 n+1,n+2,-,2nn+1,n+2,-,2nn+1,n+2,-,2n 中恰好有 mmm 个数 在二进制下恰好有 kkk 个 ...
- 2013ACM/ICPC亚洲区南京站现场赛-HDU4809(树形DP)
为了这个题解第一次写东西..(我只是来膜拜爱看touhou的出题人的).. 首先以为对称性质..我们求出露琪诺的魔法值的期望就可以了..之后乘以3就是答案..(话说她那么笨..能算出来么..⑨⑨⑨⑨⑨ ...
随机推荐
- 题解 Luogu P1099 【树网的核】
这题是真的水啊... ------------ 昨天模拟赛考了这题,很多人都是O($n^3$)水过,但我认为,要做就做的足够好(其实是我根本没想到O($n^3$)的做法),然后就开始想O(n)的解法. ...
- django使用pyecharts(4)----django加入echarts_增量更新
四.Django 前后端分离_定时增量更新图表 1.安装 djangorestframework linux pip3 install djangorestframework windows pip ...
- 基于TCP的编程
前提:本文基于Linux系统下的学习 服务器端 1 创建通讯端口,返回socket设备的文件描述符 sfdsocket(2)#include <sys/types.h> /* See NO ...
- H5中表格的用法
1.表格的基本结构: 表格由行和列组成,单元格式表格的最基本单元;每个表格均有若干行,行标签由<tr></tr>定义,每行被分割为若干单元格,由<td></t ...
- Istio旨在成为容器化微服务的网格管道
在精彩的软件容器世界中,当新项目涌现并解决你认为早已解决的问题时,这感觉就像地面在你的脚下不断地移动.在许多情况下,这些问题很久以前被解决,但现在的云原生架构正在推动着更大规模的应用程序部署,这就需要 ...
- 多线程面试题之【三线程按顺序交替打印ABC的方法】
建立三个线程,线程名字分别为:A.B.C,要求三个线程分别打印自己的线程名字,但是要求三个线程同时运行,并且实现交替打印,即按照ABCABCABC的顺序打印.打印10轮,打印完毕控制台输出字符串:&q ...
- hdu 6661 Acesrc and String Theory (后缀数组)
大意: 求重复$k$次的子串个数 枚举重复长度$i$, 把整个串分为$n/i$块, 如果每块可以$O(1)$计算, 那么最终复杂度就为$O(nlogn)$ 有个结论是: 以$j$开头的子串重复次数最大 ...
- [The 2019 Asia Yinchuan First Round Online Programming] D Take Your Seat
也许更好的阅读体验 \(\mathcal{Description}\) 原题链接 题目大意 该题目有两个问题 \(Task\ 1\),有\(n\)个人\(n\)个座位,每个人都有一个对应的座位,每个人 ...
- 更新到PS CC 2019 缩放的时候 按住shift变成不规则缩放了 反而不按住shift是等比例缩放
更新到PS CC 2019 缩放的时候 按住shift变成不规则缩放了 反而不按住shift是等比例缩放 更新到PS CC 2019 缩放的时候 按住shift变成不规则缩放了 反而不按住shift是 ...
- windows下安装mysql-8.0.18-winx64
1.下载安装包 安装包现在地址: https://dev.mysql.com/downloads/mysql/ 2.解压缩至安装目录 解压缩下载之后的zip,我这里使用的安装路径为: C:\Progr ...