Description

题库链接

给你 \(n\) 个节点的一棵树,点分黑白。 \(q\) 组询问,每次询问类似于“是否存在树中 \(x\) 个点的连通块恰有 \(y\) 个黑点”。 \(t\) 组数据。

\(1\leq t\leq 5,1\leq n\leq 5000,q\leq 10^5\)

Solution

由于询问比较多,容易猜到一个结论,就是 \(x\) 个点的连通块能取到黑点的个数一定是完整的一段区间。

就是只要 \(y\geq\) \(x\) 个点的连通块黑点个数的下界,且 \(y\leq\) \(x\) 个点的连通块黑点个数的上界,那么就满足题设条件。

具体证明,大概就是在 \(x\) 个点的连通块中删去边界一个点,再加上另一个不在连通块内的点这样黑点增量(减量)是不大于 \(1\) 的,那么就一定能取到一整段区间内的数。

可以用 \(O(n^2)\) 的树上背包来预处理出这个上界下界。最后 \(O(1)\) 回答询问即可。

Code

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. const int N = 5000+5;
  4. int n, q, d[N], u, v, f[N][N], g[N][N], size[N];
  5. struct tt {int to, next; }edge[N<<1];
  6. int path[N], top;
  7. void dfs(int u, int fa) {
  8. if (d[u] == 1) f[u][1] = g[u][1] = 1;
  9. else f[u][1] = g[u][1] = 0;
  10. size[u] = 1;
  11. for (int i = path[u], v; ~i; i = edge[i].next)
  12. if ((v = edge[i].to) != fa) {
  13. dfs(v, u);
  14. for (int p = size[u]; p; p--)
  15. for (int q = size[v]; q; q--)
  16. f[u][p+q] = min(f[u][p+q], f[u][p]+f[v][q]),
  17. g[u][p+q] = max(g[u][p+q], g[u][p]+g[v][q]);
  18. size[u] += size[v];
  19. }
  20. for (int i = 1; i <= size[u]; i++)
  21. f[0][i] = min(f[0][i], f[u][i]), g[0][i] = max(g[0][i], g[u][i]);
  22. }
  23. void add(int u, int v) {edge[++top] = (tt){v, path[u]}; path[u] = top; }
  24. void work() {
  25. memset(path, top = -1, sizeof(path));
  26. scanf("%d%d", &n, &q);
  27. for (int i = 1; i < n; i++) scanf("%d%d", &u, &v), add(u, v), add(v, u);
  28. for (int i = 1; i <= n; i++) scanf("%d", &d[i]);
  29. memset(f, 127/3, sizeof(f)), memset(g, 0, sizeof(g));
  30. dfs(1, 0);
  31. while (q--) {
  32. scanf("%d%d", &u, &v);
  33. if (f[0][u] <= v && v <= g[0][u]) puts("YES");
  34. else puts("NO");
  35. }
  36. puts("");
  37. }
  38. int main() {int t; cin >> t; while (t--) work(); return 0; }

[BZOJ 5072]小A的树的更多相关文章

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

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

  2. bzoj 4031: 小Z的房间 矩阵树定理

    bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...

  3. bzoj 1901: Zju2112 Dynamic Rankings(树套树)

    1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...

  4. BZOJ 5028 小z的加油站

    bzoj链接 Time limit 10000 ms Memory limit 262144 kB OS Linux 感想 树上动态gcd的第二题也好了. [x] BZOJ 2257 [JSOI200 ...

  5. 小机房的树 codevs 2370

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

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

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

  7. Codevs 2370 小机房的树

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

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

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

  9. bzoj 3437 小p的农场

    bzoj 3437 小p的农场 思路 \(f[i]=min(f[j]+\sum\limits_{k=j+1}^{i}{b[k]*(i-k)}+a[i])\) \(f[i]=min(f[j]+\sum\ ...

随机推荐

  1. AndroidPn源码分析(二)

    接上篇: (一)客户端与服务器建立连接 上一篇写到ClientSession createClientSession这里,创建一个客户端的session.在SessionManager类中创建了ses ...

  2. ChicagoBoss简介

    翻译人:李罗琦 (ChicagoBoss)[http://www.chicagoboss.org] 由 Evan Miller创作,使用erlang/OTP的开发者们可以通过它提供的一个类似于Ruby ...

  3. 在Asp.net Core中使用中间件来管理websocket

    介绍 ASP.NET Core SignalR是一个有用的库,可以简化Web应用程序中实时通信的管理.但是,我宁愿使用WebSockets,因为我想要更灵活,并且与任何WebSocket客户端兼容. ...

  4. Android 导入 aar 库文件

    1. 在需要导入 aar 的 module 目录下创建一个名叫 "aars" 的目录,并把 aar 文件复制到这里. 2. 在项目的 build.gradle 文件里添加 allp ...

  5. SqlAlchemy操作(一)

    博客转载于 http://www.cnblogs.com/haiyan123/p/8270520.html 一. 介绍 SQLAlchemy是一个基于Python实现的ORM框架.该框架建立在 DB ...

  6. centos7 安装django

    环境:centos7.4  ,python用的venv 3.6 ,django 2.1 注意点:django2.2再使用venv环境的时候会报SQList版本不足问题,升级数据库太费劲,不如重来 安装 ...

  7. 792. Number of Matching Subsequences

    Given string S and a dictionary of words words, find the number of words[i] that is a subsequence of ...

  8. 741. Cherry Pickup

    In a N x N grid representing a field of cherries, each cell is one of three possible integers. 0 mea ...

  9. Breadth-first Search-690. Employee Importance

    You are given a data structure of employee information, which includes the employee's unique id, his ...

  10. 队列(循环队列)----C语言

    线性结构:有且只有一个根节点,且每个节点最多有一个直接前驱和一个直接后继的非空数据结构 非线性结构:不满足线性结构的数据结构 队列 队列一般分为两类:链式队列和顺序队列 链式队列---链式队列即用链表 ...