[BZOJ 5072]小A的树
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
#include <bits/stdc++.h>
using namespace std;
const int N = 5000+5;
int n, q, d[N], u, v, f[N][N], g[N][N], size[N];
struct tt {int to, next; }edge[N<<1];
int path[N], top;
void dfs(int u, int fa) {
if (d[u] == 1) f[u][1] = g[u][1] = 1;
else f[u][1] = g[u][1] = 0;
size[u] = 1;
for (int i = path[u], v; ~i; i = edge[i].next)
if ((v = edge[i].to) != fa) {
dfs(v, u);
for (int p = size[u]; p; p--)
for (int q = size[v]; q; q--)
f[u][p+q] = min(f[u][p+q], f[u][p]+f[v][q]),
g[u][p+q] = max(g[u][p+q], g[u][p]+g[v][q]);
size[u] += size[v];
}
for (int i = 1; i <= size[u]; i++)
f[0][i] = min(f[0][i], f[u][i]), g[0][i] = max(g[0][i], g[u][i]);
}
void add(int u, int v) {edge[++top] = (tt){v, path[u]}; path[u] = top; }
void work() {
memset(path, top = -1, sizeof(path));
scanf("%d%d", &n, &q);
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", &d[i]);
memset(f, 127/3, sizeof(f)), memset(g, 0, sizeof(g));
dfs(1, 0);
while (q--) {
scanf("%d%d", &u, &v);
if (f[0][u] <= v && v <= g[0][u]) puts("YES");
else puts("NO");
}
puts("");
}
int main() {int t; cin >> t; while (t--) work(); return 0; }
[BZOJ 5072]小A的树的更多相关文章
- bzoj 5072 小A的树 —— 树形DP
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=5072 由于对于一个子树,固定有 j 个黑点,连通块大小是一个连续的范围: 所以记 f[i][ ...
- bzoj 4031: 小Z的房间 矩阵树定理
bzoj 4031: 小Z的房间 矩阵树定理 题目: 你突然有了一个大房子,房子里面有一些房间.事实上,你的房子可以看做是一个包含n*m个格子的格状矩形,每个格子是一个房间或者是一个柱子.在一开始的时 ...
- bzoj 1901: Zju2112 Dynamic Rankings(树套树)
1901: Zju2112 Dynamic Rankings 经典的带改动求区间第k小值问题 树套树模板,我是用的线段树套splay实现的,并且用的数组模拟的,所以可能空间略大,bzoj过了,zoj过 ...
- BZOJ 5028 小z的加油站
bzoj链接 Time limit 10000 ms Memory limit 262144 kB OS Linux 感想 树上动态gcd的第二题也好了. [x] BZOJ 2257 [JSOI200 ...
- 小机房的树 codevs 2370
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Description 小机房有棵焕狗种的树 ...
- 【codevs2370】小机房的树 LCA 倍增
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为0 ...
- Codevs 2370 小机房的树
2370 小机房的树 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 小机房有棵焕狗种的树,树上有N个节点,节点标号为 ...
- 牛客挑战赛30 小G砍树 树形dp
小G砍树 dfs两次, dp出每个点作为最后一个点的方案数. #include<bits/stdc++.h> #define LL long long #define fi first # ...
- 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\ ...
随机推荐
- ionic xcode8 App上传应用详细流程
第一步: 进入开发者官网 https://developer.apple.com 2.证书 序号1:开发者证书,用于真机调试 序号2:上传证书,用于发布最终版 3.证书申请 由于我现在是要发布 ...
- Replication--查看未分发命令和预估所需时间
当复制有延迟时,我们可以使用复制监视器来查看各订阅的未分发命令书和预估所需时间,如下图: 但是当分发和订阅数比较多的时候,依次查看比较费时,我们可以使用sys.sp_replmonitorsubscr ...
- Alwayson--辅助副本状态
1. 同步中(SYNCHRONIZING),主副本和辅助副本之间存在数据差异,并正在进行同步: 2. 已同步(SYNCHRONIZED),主副本和辅助副本之间不存在数据差异,无需要同步的日志: 3. ...
- Android开发基于百度地图的乘车助手
写在前面: 出去玩免不了挤公交.等地铁,不知道乘车方案当然不行,用官方APP吧,缺点一大堆,手机浏览器在线查的话既慢又麻烦...为了解决这些问题,我们来做一个简版的出行助手,嘛嘛再也不用担心我会迷路了 ...
- C#时间加减
DateTime dt =......//减数DateTime dt_n = DateTime.Now;//被减数 long x = dt .ToFileTime();//表示自协调世界时 (UTC) ...
- Docker registry 私有仓库镜像查询、删除、上传、下载 shell
#Docker官方私有仓库registry #官方只提供了API接口,不方便使用,就写了个shell #docker-registry安装配置http://www.cnblogs.com/elvi/p ...
- xiaocong/uiautomator
uiautomator This module is a Python wrapper of Android uiautomator testing framework. It works ...
- jzoj5923
我們可以記f[i]表示i個點的連通圖的個數 則我們可以考慮將i個點不必聯通的圖個數(記為g)減去i個點的不連通圖個數 那麼f[i]=g[i]-c(j-1,i-1)f[j]gi-j 枚舉一個j,強制將j ...
- 队列的实现——c++
一.介绍 队列(Queue),是一种线性存储结构.它有以下几个特点:(01) 队列中数据是按照"先进先出(FIFO, First-In-First-Out)"方式进出队列的.(02 ...
- QQ个人信息保护 | 攻的对面叫防
近来我们愈来愈重视个人信息保护,当接到骚扰电话时,你心里或许在想(我手机号怎么又被别人知道的?别人是怎么知道我手机号的?),现在的时代,手机已或不可缺,QQ几乎每个人都在用.而有些人总想保护个人QQ资 ...