[BZOJ1316]树上的询问 点分治
1316: 树上的询问
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 1017 Solved: 287
[Submit][Status][Discuss]
Description
Input
Output
Sample Input
1 2 5
1 3 7
1 4 1
3 5 2
3 6 3
1
8
13
14
Sample Output
Yes
No
Yes
HINT
30%的数据,n≤100.
100%的数据,n≤10000,p≤100,长度≤1000000.
做完此题可看下POJ 3237 Tree
Source
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<cstdio>
#include<algorithm>
#include<cmath>
#define maxn 100000
using namespace std;
int n,q;
int ask[maxn];
int ans[maxn];
struct edge {
int to,next,c;
}e[maxn*];
int head[maxn],cnt;
void add(int u,int v,int c){e[cnt].to=v;e[cnt].next=head[u];e[cnt].c=c;head[u]=cnt++;}
int root;
int vis[maxn],size[maxn],sum,f[maxn];
void findrt(int x,int fa) {
size[x]=;f[x]=;
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;if(to==fa||vis[to]) continue;
findrt(to,x);
size[x]+=size[to];
f[x]=max(f[x],size[to]);
}
f[x]=max(f[x],sum-size[x]);
if(f[x]<f[root]) root=x;
}
int dis[maxn],t[maxn],tt,tmp,num[maxn];
int dfs(int x,int fa,int d) {
dis[++tt]=d;
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;if(to==fa||vis[to]) continue;
dfs(to,x,d+e[i].c);
}
}
void cal(int x,int fl,int d) {
tt=;tmp=;
dfs(x,,d);
sort(dis+,dis+tt+);
for(int i=;i<=tt;i++) {
if(dis[i]!=dis[i-]||i==) dis[++tmp]=dis[i],num[tmp]=;
else num[tmp]++;
}
for(int i=;i<=q;i++) {
for(int j=;j<=tmp;j++)
if(num[j]>=&&dis[j]*==ask[i]) ans[i]+=fl*num[j]*(num[j]-);
int l=,r=tmp;
while(l<r) {
if(dis[l]+dis[r]>ask[i]&&l<r) r--;
else {
if(dis[l]+dis[r]==ask[i]) ans[i]+=fl*num[l]*num[r];
l++;
}
}
} }
void work(int x) {
vis[x]=;cal(x,,);
for(int i=head[x];i>=;i=e[i].next) {
int to=e[i].to;if(vis[to]) continue;
cal(to,-,e[i].c);
root=;sum=size[to];findrt(to,x);
work(root);
}
}
int main() {
memset(head,-,sizeof(head));
scanf("%d%d",&n,&q);
for(int i=;i<n;i++) {
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add(a,b,c);add(b,a,c);
}
for(int i=;i<=q;i++) scanf("%d",&ask[i]);
f[]=;sum=n;
findrt(,);
work(root);
for(int i=;i<=q;i++)
if(ans[i]>||!ask[i]) printf("Yes\n");
else printf("No\n");
}
[BZOJ1316]树上的询问 点分治的更多相关文章
- 【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 1316: 树上的询问( 点分治 + 平衡树 )
直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...
- 【点分治】bzoj1316 树上的询问
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; #defin ...
- [bzoj1316] 树上的询问
裸的点分治.. 及时把已经确定的询问清掉就能快不少.时间复杂度O(nlogn*p) #include<cstdio> #include<iostream> #include&l ...
- BZOJ_1316_树上的询问_点分治
BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...
- 【BZOJ-3784】树上的路径 点分治 + ST + 堆
3784: 树上的路径 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 462 Solved: 153[Submit][Status][Discuss ...
- 【Luogu2664】树上游戏(点分治)
[Luogu2664]树上游戏(点分治) 题面 洛谷 题解 很好的一道点分治题. 首先直接点分治,考虑过每个分治重心的链的贡献. 我们从分治重心开始找每种颜色,强制令一种颜色只在其到分治重心的链上第一 ...
- 【bzoj1316】树上的询问 树的点分治+STL-set
题目描述 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 输入 第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行 ...
随机推荐
- 深入理解Java Web——Servlet
1.概述 狭义上看,是java的一个接口. 广义上看,任何直接或间接实现了Servlet接口的类. 2.核心对象 下面就是Servlet接口的内容: public abstract interface ...
- hdu6121 build a tree(树)
题解: 可以考虑每一层结点的子树大小 必定满足下面的情况,即 a,a,a,a,a,a,b,c,c,c,c........ 然后每一层依次往上更新,结果是不变的 一共有logn层,所以依次扫上去,统计结 ...
- Android-使用ViewFlipper实现轮番切换广告栏
所谓的轮番切换广告栏,指的是下面这个东西,笔主不知道该怎么确切描述这货... 笔主没有百度研究过其他大牛是怎么实现这个功能的,在这里笔主充分发挥DIY精神,利用ViewFlipper闭门土制了一个,下 ...
- 微信小程序使用Socket
首先,一个小程序同时只能有一个WebSocket连接,如果当前已经存在一个WebSocket连接,会关闭当前连接,并重新建立一个连接. 其次,如果使用了appID,协议必须是 wss://... 最近 ...
- Codeforces Round #348 (VK Cup 2016 Round 2, Div. 2 Edition) C
C. Little Artem and Matrix time limit per test 2 seconds memory limit per test 256 megabytes input s ...
- python3创建目录
感觉python3最好用的创建目录函数是os.makedirs,它可以设置在多级目录不存在时自动创建,已经存在也不抛出异常. import os os.makedirs('hello/hello1/h ...
- poj 2104 (主席树写法)
//求第K的的值 1 #include<stdio.h> #include<iostream> #include<algorithm> #include<cs ...
- 用filters定制化spring的包扫描
Fiter的信息如下: Filter的类型有:annotation(这是spring默认的),assignable,aspectj, regex,custom 首先看一下我这个demo的目录结构: 上 ...
- 2015年网易校招Java开发工程师(技术架构)在线笔试题
1. 程序和进程的本质区别是? A.在外存和内存存储 B.非顺序和顺序执行机器指令 C.独占使用和分时使用计算机资源 D.静态和动态特征 参考答案分析: 进程与应用程序的区别: 进程(Process ...
- nginx对指定目录做代理
环境介绍 web1,作为前端端服务器,访问地址是http://192.168.1.1,要将http://192.168.1.1/bbs的请求交给web2.在web1的网站根目录下并没有bbs目录 we ...