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 ...
随机推荐
- [转]谈谈Linux下动态库查找路径的问题
http://blog.chinaunix.net/uid-23069658-id-4028681.html 学习到了一个阶段之后,就需要不断的总结.沉淀.清零,然后才能继续“上路”.回想起自己当年刚 ...
- php实现简单的权限管理
今天主要来实现一个权限管理系统,它主要是为了给不同的用户设定不同的权限,从而实现不同权限的用户登录之后使用的功能不一样,首先先看下数据库 总共有5张表,qx_user,qx_rules和qx_jues ...
- jQuery中的find()与filter()
这是jQuery里常用的2个方法.他们2者功能是完全不同的. <div class="css"> <p class="rain">测试1 ...
- 1855: [Scoi2010]股票交易[单调队列优化DP]
1855: [Scoi2010]股票交易 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 1083 Solved: 519[Submit][Status] ...
- Map中存放数组
Map<String,Object> map = new HashMap<String, Object>(); Map<String,String> agentMa ...
- poj2826 An Easy Problem?!【计算几何】
含[三点坐标计算面积].[判断两线段是否有交点].[求线段交点]模板 An Easy Problem?! Time Limit: 1000MS Memory Limit: 65536K Tot ...
- kubernetes基础知识:限制POD和容器运行的CPU、内存
限制运行内存 https://kubernetes.io/docs/tasks/configure-pod-container/assign-memory-resource/ 先看一个pod的yaml ...
- Browser Cookie Limits
w https://cait.calarts.edu/hc/en-us/articles/217055138-Error-Maximum-Number-of-Cookie-Values-Reached ...
- 5.2 - ToDoList
一.ToDoList需求 参考链接http://www.todolist.cn/ 1.将用户输入添加至待办项 2.可以对todolist进行分类(待办项和已完成组),用户勾选既将待办项分入已完成组 3 ...
- lua相关库安装常见问题
一.先安装lua brew install lua 我本机的安装路径为:/usr/local/Cellar/lua/5.3.4_2 二.安装luarocks 下载luarocks的安装包: http: ...