1316: 树上的询问

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 1017  Solved: 287
[Submit][Status][Discuss]

Description

一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No.

Input

第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行三个数x, y, c,表示有一条树边x→y,长度为c. 接下来p行每行一个数Len,表示询问树中是否存在一条长度为Len的路径.

Output

输出有p行,Yes或No.

Sample Input

6 4
1 2 5
1 3 7
1 4 1
3 5 2
3 6 3
1
8
13
14

Sample Output

Yes
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]树上的询问 点分治的更多相关文章

  1. 【BZOJ1316】树上的询问 点分治+set

    [BZOJ1316]树上的询问 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整数n, ...

  2. [bzoj1316]树上的询问_点分治

    树上的询问 bzoj-1316 题目大意:一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 注释:$1\le n\le 10^4$,$1\ ...

  3. BZOJ 1316: 树上的询问( 点分治 + 平衡树 )

    直接点分治, 用平衡树(set就行了...)维护. -------------------------------------------------------------------------- ...

  4. 【点分治】bzoj1316 树上的询问

    #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #defin ...

  5. [bzoj1316] 树上的询问

    裸的点分治.. 及时把已经确定的询问清掉就能快不少.时间复杂度O(nlogn*p) #include<cstdio> #include<iostream> #include&l ...

  6. BZOJ_1316_树上的询问_点分治

    BZOJ_1316_树上的询问_点分治 Description 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. Input 第一行两个整 ...

  7. 【BZOJ-3784】树上的路径 点分治 + ST + 堆

    3784: 树上的路径 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 462  Solved: 153[Submit][Status][Discuss ...

  8. 【Luogu2664】树上游戏(点分治)

    [Luogu2664]树上游戏(点分治) 题面 洛谷 题解 很好的一道点分治题. 首先直接点分治,考虑过每个分治重心的链的贡献. 我们从分治重心开始找每种颜色,强制令一种颜色只在其到分治重心的链上第一 ...

  9. 【bzoj1316】树上的询问 树的点分治+STL-set

    题目描述 一棵n个点的带权有根树,有p个询问,每次询问树中是否存在一条长度为Len的路径,如果是,输出Yes否输出No. 输入 第一行两个整数n, p分别表示点的个数和询问的个数. 接下来n-1行每行 ...

随机推荐

  1. CentOS7中rpm,yum软件安装命令

    RPM包常用安装位置说明 /etc/                   配置文件安装目录 /usr/bin/               可执行的命令安装目录 /usr/lib/           ...

  2. idea tomcat 启动报错 org.apache.catalina.core.StandardService.initInternal Failed to initialize connector

    org.apache.catalina.core.StandardService.initInternal Failed to initialize connector org.apache.cata ...

  3. Storm ui 显示异常

    今天安装storm集群的时候,各个进程也都起来,却发现Storm ui界面下无法观察Storm集群的状态 有很多地方处理不当都会造成这种现象: 1.storm.yaml配置不当 2.防火墙的问题 3. ...

  4. Java 对象及其内存控制

    作者:禅楼望月(http://www.cnblogs.com/yaoyinglong) 更新:其实这里有好多的变戏法,只要你理解了他们在JVM的中的实现机制,就豁然开朗了.有时间我会把这些变戏法的东西 ...

  5. SMT(SF)

    示例一: uint iPwmDuty; double temp; temp = (double)AdConvert(AN_TEMPERATURE); temp = temp/; iPwmDuty = ...

  6. 【BZOJ 1407】[Noi2002]Savage ExGCD

    我bitset+二分未遂后就来用ExGCD了,然而这道题的时间复杂度还真是玄学...... 我们枚举m然后对每一对用ExGCD判解,我们只要满足在最小的一方死亡之前无解就可以了,对于怎么用,就是ax+ ...

  7. MySQL使用笔记(三)表的操作

    By francis_hao    Dec 11,2016 表的操作 表的操作有创建表.查看表.删除表和修改表 创建表 创建表之前要在某个数据库中. mysql> create table ta ...

  8. HDU 5671 矩阵

    Matrix Time Limit: 3000/1500 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Su ...

  9. [uva 1350]数位dp+二分

    题目链接:https://vjudge.net/problem/38405 #include<bits/stdc++.h> using namespace std; ][]; ]; lon ...

  10. ionic改tab文字和icon图片的颜色

    The official way would be: Change in your theme/variables.scss Active icon for tabs on android is: $ ...