题意

给出一棵 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的树 题解的更多相关文章

  1. BZOJ5072 小A的树(树形dp)

    容易猜到能选择的黑点个数是一个连续区间.那么设f[i][j]为i子树内选j个点形成包含根的连通块,最多有几个黑点,g[i][j]为最少有几个黑点,暴力dp是O(n2)的,求出每个连通块大小对应的黑点数 ...

  2. [BZOJ5072] 小A的树

    设计状态\(f[i][j]\)表示以i为根的子树,包含j个点的最小黑点数,\(g[i][j]\)表示以\(i\) 为子树,包含\(j\)个点的最大黑点数,然后树形背包转移即可. 每次询问的时候就看包含 ...

  3. 【BZOJ5072】[Lydsy十月月赛]小A的树 树形DP

    [BZOJ5072][Lydsy十月月赛]小A的树 题解:考虑我们从一个联通块中替换掉一个点,导致黑点数量的变化最多为1.所以我们考虑维护对于所有的x,y的最大值和最小值是多少.如果询问的y在最大值和 ...

  4. 小机房的树 codevs 2370

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Description 小机房有棵焕狗种的树 ...

  5. 【codevs2370】小机房的树 LCA 倍增

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...

  6. LCA(倍增在线算法) codevs 2370 小机房的树

    codevs 2370 小机房的树 时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点, ...

  7. codevs——2370 小机房的树

    2370 小机房的树  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 小机房有棵焕狗种的树,树上有N个 ...

  8. Vijos1448校门外的树 题解

    Vijos1448校门外的树 题解 描述: 校门外有很多树,有苹果树,香蕉树,有会扔石头的,有可以吃掉补充体力的…… 如今学校决定在某个时刻在某一段种上一种树,保证任一时刻不会出现两段相同种类的树,现 ...

  9. Codevs 2370 小机房的树

    2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为 ...

随机推荐

  1. request获取url链接和参数

            //Returns the part of this request's URL from the protocol name up to the query string in th ...

  2. ASP.NET Core on K8S深入学习(3)Deployment

    上一篇<部署过程解析与安装Dashboard>中我们了解K8S的部署过程,这一篇我们来了解一下K8S为我们提供的几种应用运行方式:Deployment.DaemonSet与Job,它们是K ...

  3. 【Java例题】4.4使用牛顿迭代法求方程的解

    4. 使用牛顿迭代法求方程的解:x^3-2x-5=0区间为[2,3]这里的"^"表示乘方. package chapter4; public class demo4 { publi ...

  4. 实现ssr服务端渲染demo

    最近在研究SSR服务器端渲染,自己写了的小demo. 项目布局 ├── build // 配置文件 │   │── webpack.base // 公共配置 │   │── webpack.clien ...

  5. Spring Boot之Profile--快速搞定多环境使用与切换

    Spring Profile是Spring3引入的概念,主要用在项目多环境运行的情况下,通过激活方式实现多环境切换,省去多环境切换时配置参数和文件的修改,并且Spring profile提供了多种激活 ...

  6. (二)c#Winform自定义控件-按钮

    前提 入行已经7,8年了,一直想做一套漂亮点的自定义控件,于是就有了本系列文章. 开源地址:https://gitee.com/kwwwvagaa/net_winform_custom_control ...

  7. 史上最全面的SignalR系列教程-4、SignalR 自托管全解(使用Self-Host)-附各终端详细实例

    1.概述 通过前面几篇文章 史上最全面的SignalR系列教程-1.认识SignalR 史上最全面的SignalR系列教程-2.SignalR 实现推送功能-永久连接类实现方式 史上最全面的Signa ...

  8. 如何将自己的代码发布到Maven中央仓库?

    去年在公司做工作流相关业务时,当时使用flowable做引擎,中途涉及到一些业务上的需求,自己整理了一些代码,考虑到开源精神,当时就想着将于公司业务无关的代码抽离出来,放到Maven中央仓库中,以供别 ...

  9. 曹工杂谈:一例简单的Jar包冲突解决示例

    Jar包冲突的相关文章: 了不得,我可能发现了Jar 包冲突的秘密   一.前言 jar包冲突分多种,简单理解来说,就是同package且同名的类在多个jar包内出现,如果两个jar包在同一个clas ...

  10. CSS3的滤镜filter属性

    css3的滤镜filter属性,可以对网页中的图片进行类似Photoshop图片处理的效果,例如背景的毛玻璃效果.老照片(黑白照片).火焰效果等. 一.blur(px)高斯模糊 二.brightnes ...