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 ...
随机推荐
- Spring学习笔记--自动检测
要使用自动检测,我们需要用到<context:annotation-scan>标签.<context:annotation-scan>元素除了完成与<context:an ...
- js的等于号==的判断
var str=0; str == "" 将返回true:
- PHP 预定义超全局数组/变量
1.超全局变量:不用定义声明即可用.PHP有九种 2.$_GET:通过参数传递给当前脚本的变量的数组 浏览器页面-->(http协议)->apache-->php module--& ...
- anguglar 2+ md5加密
1.安装 npm install ts-md5 --save 2.使用 import {Md5} from "ts-md5/dist/md5"; constructor() {co ...
- Hibernate的检索方式--查询数据的方式
Hibernate 提供了以下几种检索对象的方式1导航对象图检索方式: 根据已经加载的对象导航到其他对象(根据已经加载的对象,导航到其他对象-例如一对多的查询)2OID 检索方式: 按照对象的 OID ...
- Delphi编写下载程序:UrlDownloadToFile的进度提示
urlmon.dll中有一个用于下载的API,MSDN中的定义如下: HRESULT URLDownloadToFile( LPUNKNOWN pCaller, L ...
- 在Ubuntu上搭建hive环境
一.准备软件 二.安装虚拟机 1.新建虚拟机向导 2.安装客户机操作系统 3.用户名密码设置 4.设置虚拟机名称和保存位置 5.处理器设置 6.设置虚拟机内存 7.然后一直next下去(有的根据自己的 ...
- 在Mac下使用ll,la,l
一: 用户目录下建立一个脚本“.bash_profile”,并输入以下内容即可: alias ll='ls -alF' alias la='ls -A' alias l='ls -CF' 二: sou ...
- PHP之冒号、endif、endwhile、endfor 是什么鬼?f
解释:其实这些都是PHP的语法,只不过不常用而已,这些都是PHP流程控制的替代语法. 冒号(:)相当于是 左大括号---->{ endif.endwhile.endfor.endforeach- ...
- js Ajax 跨域请求
一.使用jsonp的方式(只支持get请求) 二.使用cors的方式(支持HTTP的大部分请求方式) 三.apache的转发(修改服务器配置) 没有试验,暂时不详细写!