BZOJ 1316: 树上的询问
挺裸的点分治
刚开始想用map水过去,然后做p次点分治,然后T到自闭
最后发现可以sort一遍,然后去重,记录每个数出现的次数,这样就可以双指针,不会漏掉了
#include <bits/stdc++.h>
using namespace std; #define N 100010
int n, q, Q[N], ans[N];
struct Graph
{
struct node
{
int to, nx, w;
node() {}
node (int to, int nx, int w) : to(to), nx(nx), w(w) {}
}a[N << ];
int head[N], pos;
void add(int u, int v, int w)
{
a[++pos] = node(v, head[u], w); head[u] = pos;
a[++pos] = node(u, head[v], w); head[v] = pos;
}
}G;
#define erp(u) for (int it = G.head[u], v = G.a[it].to, w = G.a[it].w; it; it = G.a[it].nx, v = G.a[it].to, w = G.a[it].w) bool vis[N];
int root, sum, sze[N], f[N];
void getroot(int u, int fa)
{
sze[u] = , f[u] = ;
erp(u) if (v != fa && !vis[v])
{
getroot(v, u);
sze[u] += sze[v];
f[u] = max(f[u], sze[v]);
}
f[u] = max(f[u], sum - sze[u]);
if (f[u] < f[root]) root = u;
} int deep[N], d[N];
void getdeep(int u, int fa)
{
deep[++deep[]] = d[u];
erp(u) if (v != fa && !vis[v])
{
d[v] = d[u] + w;
getdeep(v, u);
}
} int g[N], num[];
void calc(int u, int cost, int opt)
{
d[u] = cost; deep[] = ;
getdeep(u, );
sort(deep + , deep + + deep[]);
g[] = ;
for (int i = ; i <= deep[]; ++i)
{
if (i == || deep[i] != deep[i - ]) g[++g[]] = deep[i], num[g[]] = ;
else ++num[g[]];
}
for (int i = ; i <= q; ++i)
{
for (int j = ; j <= g[]; ++j)
{
if (num[j] > && * g[j] == Q[i])
ans[i] += opt * num[j] * (num[j] - );
}
int r = g[];
for (int l = ; l < r; ++l)
{
while (l < r && g[l] + g[r] >= Q[i])
{
if (g[l] + g[r] == Q[i]) ans[i] += opt * num[l] * num[r];
--r;
}
}
}
} void solve(int u)
{
calc(u, , );
vis[u] = ;
erp(u) if (!vis[v])
{
calc(v, w, -);
sum = f[] = sze[v];
root = ;
getroot(v, u);
solve(root);
}
} void Run()
{
scanf("%d%d", &n, &q);
{
for (int i = , u, v, w; i < n; ++i)
{
scanf("%d%d%d", &u, &v, &w);
G.add(u, v, w);
}
for (int qq = ; qq <= q; ++qq) scanf("%d", Q + qq);
sum = n; f[] = n;
root = ;
getroot(, );
solve(root);
for (int i = ; i <= q; ++i) puts(ans[i] || !Q[i] ? "Yes" : "No");
}
} int main()
{
Run();
}
BZOJ 1316: 树上的询问的更多相关文章
- BZOJ 1316: 树上的询问( 点分治 + 平衡树 )
直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...
- BZOJ 1316: 树上的询问 (点分治+set)
题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1316 因为只要求存在某条路径长度为K,所以点分,然后用set判断差值是否在set中就可以了. ...
- [POJ 1316] 树上的询问
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1316 [算法] 点分治 由于边权较大,笔者在计算时使用了STL-set 注意当询问为 ...
- [BZOJ1316]树上的询问 点分治
1316: 树上的询问 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1017 Solved: 287[Submit][Status][Discus ...
- BZOJ_1316_树上的询问_点分治
BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...
- 【BZOJ1316】树上的询问 点分治+set
[BZOJ1316]树上的询问 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整数n, ...
- [bzoj1316]树上的询问_点分治
树上的询问 bzoj-1316 题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 注释:$1\le n\le 10^4$,$1\ ...
- bzoj 3784: 树上的路径 堆维护第k大
3784: 树上的路径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 88 Solved: 27[Submit][Status][Discuss] ...
- BZOJ.3784.树上的路径(点分治 贪心 堆)
BZOJ \(Description\) 给定一棵\(n\)个点的带权树,求树上\(\frac{n\times(n-1)}{2}\)条路径中,长度最大的\(m\)条路径的长度. \(n\leq5000 ...
随机推荐
- 选择LoadRunner Protocol的两大定律
选择LoadRunner Protocol的两大定律 确定性能测试脚本录制时使用的协议类型经常是一个容易引起误会的问题.很多刚刚接触到性能测试的同行常常会想当然地根据开发语言等来决定协议的选取,导致录 ...
- 【翻译】Webpack 4 从0配置到生产模式
查看原文 webpack 4 发布了! webpack 4 作为一个零配置的模块打包器 webpack 是强大的并且有许多独一无二的特点但是有一个痛点就是配置文件. 在中型到大型项目中为webpack ...
- mysql关联取附表最后一条记录,附加lareval orm实现
MySQL 多表关联一对多查询取最新的一条数据:https://blog.csdn.net/u013902368/article/details/86615382 Laravel query buil ...
- Android屏幕和尺寸
DisplayMetrics dm=new DisplayMetrics(); //获取的像素高度不包含虚拟键所占空间 ((WindowManager)context.getSystemService ...
- SQL 使用序列
SQL 使用序列 序列是根据需要产生的一组有序整数:1, 2, 3 ... 序列在数据库中经常用到,因为许多应用要求数据表中的的每一行都有一个唯一的值,序列为此提供了一种简单的方法. 本节阐述在 My ...
- IOS模拟器
IOS模拟器 目录 概述 实用操作 概述 实用操作 快速删除大量程序的方式 菜单栏 -> Reset Contain And Settings 或者:直接删除模拟器应用里面的想要去除的应用程序的 ...
- Android得到SD卡文件夹大小以及删除文件夹操作
float cacheSize = dirSize(new File(Environment.getExternalStorageDirectory() + AppConstants.APP_CACH ...
- Spoken English Practice (yesterday) (Look, I just wanted to apologize again for yesterday? It's fine, I know you didn't mean it. / when I say it, I mean it.)
绿色:连读: 红色:略读: 蓝色:浊化: 橙色:弱读 下划线_为浊化 口语蜕变(2017/7/12) ...
- EntityFramework.DynamicFilters 实现软删除和租户过滤
EntityFramework.DynamicFilters 实现软删除和租户过滤
- 小程序 Expecting 'EOF','}',',',']', got INVALID
修改了app.json中的东西,做了注释操作,报如下错误: 修改了好一阵,一直报错,原来是json文件中无法使用注释惹的祸,具体查看:官方文档