Description

BZOJ只是扔了个下载链接

Solution

设$f[x][i]$表示$x$点选中$i$个黑点的最小连通块。

设$g[x][i]$表示$x$点选中$i$个黑点的最大连通块。

转移非常明显。处理出每个情况的上下界之后差分一下$O(1)$回答询问即可。

卡空间所以要用$short$。 第二次$INF$开大了……应该多上点心了……

Code

  1. #include<iostream>
  2. #include<cstring>
  3. #include<cstdio>
  4. #define N (5009)
  5. using namespace std;
  6.  
  7. struct Edge{int to,next;}edge[N<<];
  8. int n,u,v,T,q,INF=1e4,size[N],b[N];
  9. short f[N][N],g[N][N],tmpf[N],tmpg[N],ans[N][N];
  10. int head[N],num_edge;
  11.  
  12. void add(int u,int v)
  13. {
  14. edge[++num_edge].to=v;
  15. edge[num_edge].next=head[u];
  16. head[u]=num_edge;
  17. }
  18.  
  19. void Dfs(int x,int fa)
  20. {
  21. size[x]=;
  22. for (int i=; i<=n; ++i)
  23. f[x][i]=INF,g[x][i]=-INF;
  24. f[x][b[x]]=g[x][b[x]]=;
  25. for (int i=head[x]; i; i=edge[i].next)
  26. if (edge[i].to!=fa)
  27. {
  28. int to=edge[i].to;
  29. Dfs(to,x);
  30. for (int j=; j<=size[x]+size[to]; ++j)
  31. tmpf[j]=INF,tmpg[j]=-INF;
  32. for (int j=; j<=size[x]; ++j)
  33. for (int k=; k<=size[to]; ++k)
  34. {
  35. tmpf[j+k]=min((int)tmpf[j+k],(int)f[x][j]+f[to][k]);
  36. tmpg[j+k]=max((int)tmpg[j+k],(int)g[x][j]+g[to][k]);
  37. }
  38. size[x]+=size[to];
  39. for (int j=; j<=size[x]; ++j)
  40. {
  41. f[x][j]=min(f[x][j],tmpf[j]);
  42. g[x][j]=max(g[x][j],tmpg[j]);
  43. }
  44. }
  45. for (int i=; i<=size[x]; ++i)
  46. if (f[x][i]<INF)
  47. ans[f[x][i]][i]++,ans[g[x][i]+][i]--;
  48. }
  49.  
  50. int main()
  51. {
  52. scanf("%d",&T);
  53. while (T--)
  54. {
  55. memset(ans,,sizeof(ans));
  56. memset(head,,sizeof(head));
  57. num_edge=;
  58. scanf("%d%d",&n,&q);
  59. for (int i=; i<=n-; ++i)
  60. scanf("%d%d",&u,&v),add(u,v),add(v,u);
  61. for (int i=; i<=n; ++i)
  62. scanf("%d",&b[i]);
  63. Dfs(,);
  64. for (int i=; i<=n; ++i)
  65. for (int j=; j<=n; ++j)
  66. ans[i][j]+=ans[i-][j];
  67. for (int i=; i<=q; ++i)
  68. {
  69. scanf("%d%d",&u,&v);
  70. if (ans[u][v]) puts("YES");
  71. else puts("NO");
  72. }
  73. puts("");
  74. }
  75. }

BZOJ5072:[Lydsy1710月赛]小A的树(树形DP)的更多相关文章

  1. bzoj 5072 [Lydsy1710月赛]小A的树——树形dp

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 发现对于每个子树,黑点个数确定时,连通块的大小取值范围一定是一段区间:所以考虑只最小化 ...

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

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

  3. 牛客挑战赛30 小G砍树 树形dp

    小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...

  4. bzoj 5072 小A的树 —— 树形DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 由于对于一个子树,固定有 j 个黑点,连通块大小是一个连续的范围: 所以记 f[i][ ...

  5. 【bzoj5072】[Lydsy十月月赛]小A的树 树形背包dp

    题解: 比较好想 首先注意到如果最暴力的做法复杂度无法接受 而5000的范围基本是n^2做法了 只使用已经遍历过的点数目和当前子树中的点数目转移我们知道复杂度是n^2的 于是大胆猜测一波同一个节点为根 ...

  6. [BZOJ 5072][Lydsy1710月赛]小A的树

    传送门 \(\color{green}{solution}\) 嗯...其实我也不太会,所以大胆猜个结论吧(后来证了一下,然后放弃了...). 我们发现如果要使一个联通块的黑点数量为\(k\)的方案最 ...

  7. 小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 <= ...

  8. 5073 [Lydsy1710月赛]小A的咒语

    LINK:[Lydsy1710月赛]小A的咒语 每次给定两个串 要求从a串中选出x段拼成B串 能否做到.T组数据. \(n\leq 100000,m\leq 100000,T\leq 10,x\leq ...

  9. 51nod 1353 树 | 树形DP经典题!

    51nod 1353 树 | 树形DP好题! 题面 切断一棵树的任意条边,这棵树会变成一棵森林. 现要求森林中每棵树的节点个数不小于k,求有多少种切法. 数据范围:\(n \le 2000\). 题解 ...

随机推荐

  1. C#RabbitMQ基础学习笔记

    RabbitMQ基础学习笔记(C#代码示例) 一.定义: MQ是MessageQueue,消息队列的简称(是流行的开源消息队列系统,利用erlang语言开发).MQ是一种应用程序对应用程序的通信方法. ...

  2. golang学习之defer

    golang中的defer通常用于执行一些资源释放性操作,比如open/close.connect/disconnect.lock/unlock等,对defer理解主要记住以下三点: 1.defer ...

  3. [PHP] apache在worker模式配置fastcgi使用php-fpm

    1.准备: dpkg -L apache2查看所有安装的apache2的应用 a2query -M查看apache2使用的模式 httpd -l旧版本查看当前apache模式 2.查看apache的进 ...

  4. 九、双端队列LinkedBlockDeque

    一.简介 JDK通过BlockQueue阻塞队列实现了生产者-消费者模式,生产者向队列添加数据,消费者从队列里面消费数据. 但是在有些场景里面,我们是无法区分生产者消费者的,或者说既是生产者,也是消费 ...

  5. 二、多线程之Atomic包

    一.简介 1.原子操作 我们在使用变量的时候,经常会出现资源竞争的情况,为了保证变量安全,我们就会对对应的方法添加"synchronized"同步锁来达到目的,以保证线程安全. 而 ...

  6. Spring Boot学习笔记(二)全局捕获异常处理

    非常简单只需要创建自己的异常处理类,加上两个注解,就可以了

  7. hdu 4190 Distributing Ballot Boxes 二分

    Distributing Ballot Boxes Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (J ...

  8. Redis-概述

    Redis支持的类型: String,List,Map,Set,Sorted set Redis的持久化: 1.Redis DataBase (RDB): RDB是在某个时间点将数据写入一个临时文件, ...

  9. thinkphp I() 方法

    I() 方法用于获取前台提交的表单的value值. <form id="complai_form" method="post" action=" ...

  10. csharp:A Custom CheckedListBox with Datasource

    /// <summary> /// (eraghi) /// Custom CheckedListBox with binding facilities (Value property) ...