题目描述

给定一棵有n个点的树

询问树上距离为k的点对是否存在。

输入输出格式

输入格式:

n,m 接下来n-1条边a,b,c描述a到b有一条长度为c的路径

接下来m行每行询问一个K

输出格式:

对于每个K每行输出一个答案,存在输出“AYE”,否则输出”NAY”(不包含引号)

输入输出样例

输入样例#1: 复制

2 1
1 2 2
2
输出样例#1: 复制

AYE

说明

对于30%的数据n<=100

对于60%的数据n<=1000,m<=50

对于100%的数据n<=10000,m<=100,c<=1000,K<=10000000

题解

  看一看$k$的范围,可以直接把所有答案预处理出来,然后$O(1)$查询

  时间复杂度$O(n^2)$,随机数据可以跑

  据说还有$O(nlog^2n)$的方法,然而我不会……

 //minamoto
#include<cstdio>
#include<iostream>
#define inf 0x3f3f3f3f
#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?EOF:*p1++)
char buf[<<],*p1=buf,*p2=buf;
template<class T>inline bool cmax(T&a,const T&b){return a<b?a=b,:;}
inline int read(){
#define num ch-'0'
char ch;bool flag=;int res;
while(!isdigit(ch=getc()))
(ch=='-')&&(flag=true);
for(res=num;isdigit(ch=getc());res=res*+num);
(flag)&&(res=-res);
#undef num
return res;
}
const int N=;
int ans[];
int ver[N<<],head[N],Next[N<<],edge[N<<];
int sz[N],son[N],st[N];bool vis[N];
int n,m,size,mx,rt,tot,top;
inline void add(int u,int v,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=e;
}
void getrt(int u,int fa){
sz[u]=,son[u]=;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(vis[v]||v==fa) continue;
getrt(v,u);
sz[u]+=sz[v],cmax(son[u],sz[v]);
}
cmax(son[u],size-sz[u]);
if(son[u]<mx) mx=son[u],rt=u;
}
void query(int u,int fa,int d){
st[++top]=d;
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(vis[v]||v==fa) continue;
query(v,u,d+edge[i]);
}
}
void solve(int rt,int d,int f){
top=;
query(rt,,d);
if(f){
for(int i=;i<top;++i)
for(int j=i+;j<=top;++j)
++ans[st[i]+st[j]];
}
else{
for(int i=;i<top;++i)
for(int j=i+;j<=top;++j)
--ans[st[i]+st[j]];
}
}
void divide(int u){
vis[u]=true;
solve(u,,);
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(vis[v]) continue;
solve(v,edge[i],);
mx=inf,rt=,size=sz[v];
getrt(v,);
divide(rt);
}
}
int main(){
n=read(),m=read();
for(int i=;i<n;++i){
int u=read(),v=read(),e=read();
add(u,v,e);
}
rt=,mx=inf,size=n;
getrt(,),divide(rt);
while(m--){
int k=read();
puts(ans[k]?"AYE":"NAY");
}
return ;
}

最新文章

  1. typeid详解(转)
  2. Eclipse引入外部Jar在发布时没有自动带入,导致出现ClassNoFound错误
  3. Grand Theft Auto V 图形研究(3)
  4. Java多线程——&lt;四&gt;让线程有返回值
  5. jsp界面动态时间显示
  6. Java序列化之transient和serialVersionUID的使用
  7. [转载] extern &quot;C&quot;的用法解析
  8. 一篇非常经典的springMVC注解实现方式详解
  9. Mysql MERGE 引擎在分表环境下得使用
  10. SICP练习1.6-1.8
  11. Linux 初设root 密码
  12. C++的string类
  13. HBase Filter及对应Shell
  14. Ubuntu 16.04上安装Global阅读源代码工具
  15. BAT美团滴滴java面试大纲(带答案版)之三:多线程synchronized
  16. 洛谷P4774 屠龙勇士
  17. ansible-role写法
  18. Python基础2 列表 字典 集合
  19. C++技术沙龙报名开始啦!
  20. 深入浅出REST(转载)

热门文章

  1. Apache Hive (四)Hive的连接3种连接方式
  2. C#根据url生成唯一的key
  3. 第五章 大数据平台与技术第11讲 MapReduce编程
  4. [Fiddler]如何让Fiddler可以抓取https的请求
  5. Oracle 更新Opatch、打补丁
  6. position与offset的区别
  7. JavaScript排序,不只是冒泡
  8. ServiceStack.Redis.RedisNativeClient的方法“get_Db”没有实现。
  9. HDU 5792 World is Exploding (离散化+树状数组)
  10. 设计模式22:Strategy 策略模式(行为型模式)