bzoj5072 小A的树 题解
题意
给出一棵 n 个点的树,每个点有黑白两种颜色。q 次询问,每次
询问给出 x 和 y,问能否选出一个 x 个点的联通子图,使得其中
黑点数目为 y。
范围
n ≤ 5000,q ≤ 10^5
其实证明我也不会没弄懂,只是听老师讲了,我们可以猜想:对于某一大小的连通子图,其包含黑点数的最小值与最大值之间的所有点数目都能够取得到。
证明:证明很简单,考虑从最小值一个个删除点并加入点到最大值的过
程,黑点个数每次最多变化 1,因此能遍历从最小值到最大值中
的所有点。(from dzy)
我们定义f[x][y]表示以x为根的树中有y个黑点的最小节点数
同理g[x][y]表示以x为根的树中有y个黑点的最大节点数
然后这题便可以树上背包解决,时间复杂度(n^2)
代码
#include<bits/stdc++.h>
using namespace std;
const int Max=5010;
int n,T,q,tot,u,v,root,xi,yi;
int ver[Max*2],head[Max],Next[Max*2];
int score[Max];
int f[Max][Max],g[Max][Max],siz[Max],ff[Max],gg[Max];
void add(int x,int y){
ver[++tot]=y;Next[tot]=head[x];head[x]=tot;
}
void dp(int x,int fa){//由于存树时用的是双向图,此处要判断
siz[x]=1;
g[x][score[x]]=1;//初始化保证g[x][0] or f[x][0]为1,否则最小值永远是0
f[x][score[x]]=1;
for(int i=head[x];i;i=Next[i]){
int y=ver[i];
if(fa==y) continue;
dp(y,x);
memcpy(ff,f[x],sizeof f[x]);//由于在进行背包的过程中求得的不一定是最优解,故用临时数组进行储存
memcpy(gg,g[x],sizeof g[x]);
for(int t=siz[x];t>=score[x];--t){//两棵树的合并
for(int j=siz[y];j>=score[y];--j){
ff[t+j]=min(ff[t+j],f[x][t]+f[y][j]);
gg[t+j]=max(gg[t+j],g[x][t]+g[y][j]);
}
}
siz[x]+=siz[y];
for(int j=score[x];j<=siz[x];++j){
f[x][j]=ff[j];
g[x][j]=gg[j];
}
}
for(int i=0;i<=siz[x];++i){//用g[0][x] f[0][x]储存答案
f[0][i]=min(f[0][i],f[x][i]);
g[0][i]=max(g[0][i],g[x][i]);
}
return;
}
int main(){
//freopen("trees.in","r",stdin);
//freopen("trees.out","w",stdout);
scanf("%d",&T);
while(T--){
scanf("%d %d",&n,&q);
memset(head,0,sizeof(head));
memset(f,0x3f,sizeof(f));
memset(g,0xcf,sizeof(g));
tot=0;
for(int i=1;i<n;++i){
scanf("%d %d",&u,&v);
add(u,v);
add(v,u);
}
for(int i=1;i<=n;++i){
scanf("%d",&score[i]);
}
dp(1,0);
while(q--){
scanf("%d %d",&xi,&yi);
if(xi>=f[0][yi]&&xi<=g[0][yi]){
puts("YES");
}
else puts("NO");
}printf("\n");
}
return 0;
}
注:bzoj需加快读才能过,比较卡时间
bzoj5072 小A的树 题解的更多相关文章
- BZOJ5072 小A的树(树形dp)
容易猜到能选择的黑点个数是一个连续区间.那么设f[i][j]为i子树内选j个点形成包含根的连通块,最多有几个黑点,g[i][j]为最少有几个黑点,暴力dp是O(n2)的,求出每个连通块大小对应的黑点数 ...
- [BZOJ5072] 小A的树
设计状态\(f[i][j]\)表示以i为根的子树,包含j个点的最小黑点数,\(g[i][j]\)表示以\(i\) 为子树,包含\(j\)个点的最大黑点数,然后树形背包转移即可. 每次询问的时候就看包含 ...
- 【BZOJ5072】[Lydsy十月月赛]小A的树 树形DP
[BZOJ5072][Lydsy十月月赛]小A的树 题解:考虑我们从一个联通块中替换掉一个点,导致黑点数量的变化最多为1.所以我们考虑维护对于所有的x,y的最大值和最小值是多少.如果询问的y在最大值和 ...
- 小机房的树 codevs 2370
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小机房有棵焕狗种的树 ...
- 【codevs2370】小机房的树 LCA 倍增
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...
- LCA(倍增在线算法) codevs 2370 小机房的树
codevs 2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...
- codevs——2370 小机房的树
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 小机房有棵焕狗种的树,树上有N个 ...
- Vijos1448校门外的树 题解
Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...
- Codevs 2370 小机房的树
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为 ...
随机推荐
- Redis Sentinel基本实现原理
一.出现的背景: Redis 主从复制模式下一旦主节点由于故障不能提供服务,需要人工将从节点晋升为主节点,同时还要通知应用方更新主节点地址,对于很多应用这种场景的这种故障处理方式是非常浪费人力的.为了 ...
- 不等"金九银十",金风八月,我早已拿下字节跳动的offer
字节跳动,我是在网上投的简历,之前也投过一次,简历都没通过删选,后来让师姐帮我改了一下简历,重新投另一个部门,获得了面试机会.7月23日,中午HR打电话过来预约了下午4点半面试,说会在线写代码,让我准 ...
- IDEA运行报错: Maven编译错误:不再支持源选项 5。请使用 6 或更高版本
这里 记录下 这个问题的解决方案: 1:修改maven settings.xml 中的数据 这里的版本要对应现在使用的jdk版本 2:检查idea 配置 图中2块区域要一致 检查这块地方对应了自己的j ...
- 论文解读2——Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition
背景 用ConvNet方法解决图像分类.检测问题成为热潮,但这些方法都需要先把图片resize到固定的w*h,再丢进网络里,图片经过resize可能会丢失一些信息.论文作者发明了SPP pooling ...
- ubuntu16.04安装Ros(kinetic版本)【亲测好用】
准备 1.ubuntu16.04 64位桌面版 ps:关于系统的下载和安装这里不做介绍,请自行百度,不是介绍重点 2.更改源 图上的几个勾默认是选上的,如果没有选上,选成上图这样(如果修改过勾,点击关 ...
- SQL Server 数据完整性的实现——约束
SQL Server数据库采用的是关系数据模型,而关系数据模型本身的优点之一就是模型本身集成了数据完整性.作为模型一部分而实施的数据完整性(例如在创建数据表时的列属性定义)称作为声明式(Declara ...
- Hbase多版本(version)数据写入和读取
1. 首先创建一个支持多版本的hbase表 create } 2.put几条测试数据 put ','f1:name','jack1' put ','f1:name','jack2' 3.读取多版本 ...
- net core 3.0 之Grpc新特性小试牛刀
相信微服务大家伙都有听说和知道,好处弊端咱也不多说了,Grpc算是一个比较全面的微服务框架,也得到微软的支持 总结下来就是,跨平台,可靠,通信快,扩展性强,网络消耗小,模板多语言通用 光说好处,没 ...
- 目标检测YOLO进化史之yolov1
yolov3在目标检测领域可以算得上是state-of-art级别的了,在实时性和准确性上都有很好的保证.yolo也不是一开始就达到了这么好的效果,本身也是经历了不断地演进的. yolov1 测试图片 ...
- linux系统破解密码。
Linux系统Centos7及RedHat7破解密码 步骤如下: 1.开机之后按"e"键 2.找到以linux16的开头的行在行尾添加 rd.break console=tty0 ...