BZOJ5072:[Lydsy1710月赛]小A的树(树形DP)
Description
BZOJ只是扔了个下载链接
Solution
设$f[x][i]$表示$x$点选中$i$个黑点的最小连通块。
设$g[x][i]$表示$x$点选中$i$个黑点的最大连通块。
转移非常明显。处理出每个情况的上下界之后差分一下$O(1)$回答询问即可。
卡空间所以要用$short$。 第二次$INF$开大了……应该多上点心了……
Code
#include<iostream>
#include<cstring>
#include<cstdio>
#define N (5009)
using namespace std; struct Edge{int to,next;}edge[N<<];
int n,u,v,T,q,INF=1e4,size[N],b[N];
short f[N][N],g[N][N],tmpf[N],tmpg[N],ans[N][N];
int head[N],num_edge; void add(int u,int v)
{
edge[++num_edge].to=v;
edge[num_edge].next=head[u];
head[u]=num_edge;
} void Dfs(int x,int fa)
{
size[x]=;
for (int i=; i<=n; ++i)
f[x][i]=INF,g[x][i]=-INF;
f[x][b[x]]=g[x][b[x]]=;
for (int i=head[x]; i; i=edge[i].next)
if (edge[i].to!=fa)
{
int to=edge[i].to;
Dfs(to,x);
for (int j=; j<=size[x]+size[to]; ++j)
tmpf[j]=INF,tmpg[j]=-INF;
for (int j=; j<=size[x]; ++j)
for (int k=; k<=size[to]; ++k)
{
tmpf[j+k]=min((int)tmpf[j+k],(int)f[x][j]+f[to][k]);
tmpg[j+k]=max((int)tmpg[j+k],(int)g[x][j]+g[to][k]);
}
size[x]+=size[to];
for (int j=; j<=size[x]; ++j)
{
f[x][j]=min(f[x][j],tmpf[j]);
g[x][j]=max(g[x][j],tmpg[j]);
}
}
for (int i=; i<=size[x]; ++i)
if (f[x][i]<INF)
ans[f[x][i]][i]++,ans[g[x][i]+][i]--;
} int main()
{
scanf("%d",&T);
while (T--)
{
memset(ans,,sizeof(ans));
memset(head,,sizeof(head));
num_edge=;
scanf("%d%d",&n,&q);
for (int i=; i<=n-; ++i)
scanf("%d%d",&u,&v),add(u,v),add(v,u);
for (int i=; i<=n; ++i)
scanf("%d",&b[i]);
Dfs(,);
for (int i=; i<=n; ++i)
for (int j=; j<=n; ++j)
ans[i][j]+=ans[i-][j];
for (int i=; i<=q; ++i)
{
scanf("%d%d",&u,&v);
if (ans[u][v]) puts("YES");
else puts("NO");
}
puts("");
}
}
BZOJ5072:[Lydsy1710月赛]小A的树(树形DP)的更多相关文章
- bzoj 5072 [Lydsy1710月赛]小A的树——树形dp
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 发现对于每个子树,黑点个数确定时,连通块的大小取值范围一定是一段区间:所以考虑只最小化 ...
- 【BZOJ5072】[Lydsy十月月赛]小A的树 树形DP
[BZOJ5072][Lydsy十月月赛]小A的树 题解:考虑我们从一个联通块中替换掉一个点,导致黑点数量的变化最多为1.所以我们考虑维护对于所有的x,y的最大值和最小值是多少.如果询问的y在最大值和 ...
- 牛客挑战赛30 小G砍树 树形dp
小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...
- bzoj 5072 小A的树 —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 由于对于一个子树,固定有 j 个黑点,连通块大小是一个连续的范围: 所以记 f[i][ ...
- 【bzoj5072】[Lydsy十月月赛]小A的树 树形背包dp
题解: 比较好想 首先注意到如果最暴力的做法复杂度无法接受 而5000的范围基本是n^2做法了 只使用已经遍历过的点数目和当前子树中的点数目转移我们知道复杂度是n^2的 于是大胆猜测一波同一个节点为根 ...
- [BZOJ 5072][Lydsy1710月赛]小A的树
传送门 \(\color{green}{solution}\) 嗯...其实我也不太会,所以大胆猜个结论吧(后来证了一下,然后放弃了...). 我们发现如果要使一个联通块的黑点数量为\(k\)的方案最 ...
- 小A的树 - 树形DP
题面 1 9 4 4 1 1 5 1 2 3 2 3 6 6 7 6 8 9 6 0 1 0 1 0 0 1 0 1 3 2 7 3 4 0 9 5 YES YES NO NO 题解 n <= ...
- 5073 [Lydsy1710月赛]小A的咒语
LINK:[Lydsy1710月赛]小A的咒语 每次给定两个串 要求从a串中选出x段拼成B串 能否做到.T组数据. \(n\leq 100000,m\leq 100000,T\leq 10,x\leq ...
- 51nod 1353 树 | 树形DP经典题!
51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...
随机推荐
- 向tekkaman学习
勤奋程度要向tekkaman学习,把这几年落下的补回来.
- [PHP] PHP的纯CPU基准测试(PHP5.5.9 vs PHP7.2.1)
PHP的纯CPU基准测试(PHP5.5.9 vs PHP7.2.1): 1.bench.php 可在PHP源代码的 php-src/Zend 目录 2.micro_bench.php 也可以在 PHP ...
- 单源最短路(Dijkstra算法)
#返回上一级 @Author: 张海拔 @Update: 2015-03-11 @Link: http://www.cnblogs.com/zhanghaiba/p/3514570.html Dijk ...
- Vim 技巧
:r 文件名 导入另一文件到当前文件中 :! 命令 可以不退出当前编辑的文本而能执行系统的命令 自定义快捷键 注意这里的^P这个是ctrl + V + P :map ^P I//<ESC> ...
- linux的环境变量与文件查找
1. 环境变量 1.1 变量 shell 中的变量有不同类型,可参与运算,有作用域限定 变量的作用域即变量的有效范围(比如一个函数中.一个源文件中或者全局范围),在该范围内只能有一个同名变量.一旦离开 ...
- HttpServletRequest 各种方法总结(转)
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,开发人员通过这个对象的方法,可以获得客户这些信息. 转自: ...
- PHP处理时间格式
1. 把‘2016-06-16’格式转换成‘20160616’ <?php header("Content-type: text/html; charset=utf-8"); ...
- BZOJ3193: [JLOI2013]地形生成
传送门 Sol 第一问可以考虑按照山的高度从大到小放 但是这样如果遇到高度相同的就不好考虑,那么同时要求数量限制从小到大 这样每次放的时候后面的一定不会影响前面,并且高度相同的时候前面能放的位置后面的 ...
- 线性规划费用流解法(Bzoj1061: [Noi2008]志愿者招募)
题面 传送门 Sol 线性规划费用流解法用与求解未知数为非负数的问题 这道题可以列出一堆形如 \(x[i]+x[j]+x[k]+...>=a[p]\) 的不等式 我们强行给每个式子减去一个东西, ...
- Unihan(统汉字)常用字段介绍
0 背景 1 文件 1.1 IRG Sources 1.2 Dictionary Indices 1.3 Dictionary-like Data 1.4 Other Mappings 1.5 Rad ...