裸的点分治。。

  及时把已经确定的询问清掉就能快不少。时间复杂度O(nlogn*p)

 #include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=;
struct zs{int len,id;bool done;}q[];
struct zs1{int too,pre,dis;}e[maxn<<];int tot,last[maxn];
int st[maxn],top,pre,sz[maxn],mx[maxn],POI,dis[maxn];
bool gg[],can[],del[maxn];
int i,j,k,n,m,rt,mm; int ra;char rx;
inline int read(){
rx=getchar(),ra=;
while(rx<''||rx>'')rx=getchar();
while(rx>=''&&rx<='')ra*=,ra+=rx-,rx=getchar();return ra;
}
inline int max(int a,int b){return a>b?a:b;}
void getrt(int x,int fa){
sz[x]=,mx[x]=;
for(int i=last[x];i;i=e[i].pre)if(!del[e[i].too]&&e[i].too!=fa)
getrt(e[i].too,x),sz[x]+=sz[e[i].too],mx[x]=max(mx[x],sz[e[i].too]);
mx[x]=max(mx[x],POI-sz[x]);
if(mx[x]<mx[rt])rt=x;
}
void getpoi(int x,int fa){
st[++top]=dis[x];
for(int i=last[x];i;i=e[i].pre)if(!del[e[i].too]&&e[i].too!=fa)
dis[e[i].too]=dis[x]+e[i].dis,getpoi(e[i].too,x);
}
inline void updQ(){
mm=m;m=;
for(int i=;i<=mm;i++)if(!q[i].done)q[++m]=q[i];
}
void work(int x){
int i,j,k;bool flag=;
rt=,getrt(x,);
can[]=;pre=;
for(i=last[rt];i;i=e[i].pre)if(!del[e[i].too]){
dis[e[i].too]=e[i].dis,getpoi(e[i].too,rt);
for(j=pre;j<=top;j++)
for(k=;k<=m&&q[k].len>=st[j];k++)if(can[q[k].len-st[j]])q[k].done=,flag=;
while(pre<=top)
if(st[pre]<=q[].len)
can[st[pre++]]=;
else pre++;
}
if(flag)updQ();
if(!m)return;
while(top)
if(st[top]<=)can[st[top--]]=;else top--;
del[rt]=;
for(i=last[rt];i;i=e[i].pre)if(!del[e[i].too])POI=sz[e[i].too],work(e[i].too);
} inline void insert(int a,int b,int c){
e[++tot].too=b,e[tot].dis=c,e[tot].pre=last[a],last[a]=tot;
e[++tot].too=a,e[tot].dis=c,e[tot].pre=last[b],last[b]=tot;
}
bool cmp(zs a,zs b){return a.len>b.len;} int main(){mx[]=1e9;
n=read(),m=read();int m1=m;
for(i=;i<n;i++)j=read(),k=read(),insert(j,k,read());
for(i=;i<=m;i++)q[i].len=read(),q[i].id=i;
sort(q+,q++m,cmp);
while(m&&q[m].len==)q[m].done=,m--;
POI=n,work();
for(i=;i<=m;i++)gg[q[i].id]=;
for(i=;i<=m1;i++)puts(gg[i]?"No":"Yes");
return ;
}

[bzoj1316] 树上的询问的更多相关文章

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

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

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

    1316: 树上的询问 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1017  Solved: 287[Submit][Status][Discus ...

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

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

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

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

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

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

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

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

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

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

  8. ac自动机fail树上按询问建立上跳指针——cf963D

    解法看着吓人,其实就是为了优化ac自动机上暴力跳fail指针.. 另外这题对于复杂度的分析很有学习价值 /* 给定一个母串s,再给定n个询问(k,m) 对于每个询问,求出长度最小的t,使t是s的子串, ...

  9. [POJ 1316] 树上的询问

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1316 [算法] 点分治 由于边权较大,笔者在计算时使用了STL-set 注意当询问为 ...

随机推荐

  1. 前端构建之gulp与常用插件(转载)

    原博主:幻天芒 原文地址:http://www.cnblogs.com/humin/p/4337442.html gulp是什么? http://gulpjs.com/ 相信你会明白的! 与著名的构建 ...

  2. go defer (go延迟函数)

    go defer (go延迟函数) Go语言的defer算是一个语言的新特性,至少对比当今主流编程语言如此.根据GO LANGUAGE SPEC的说法: A "defer" sta ...

  3. Java SE 8 流库(三)

    1.7. Optional类型 容器对象,可能包含或不包含非空值.如果存在一个值,isPresent()将返回true,get()将返回值.还提供了依赖于包含值是否存在的附加方法,如orElse()( ...

  4. Clonezilla SE---克隆linux------转载

    引入: 本博文将会是<学生机房中的虚拟化>专题中的核心内容.因为,通过本篇博文的讲述,大家可以看到用于网络化批量部署Linux系统的Clonezilla SE搭建的全过程.注意,几乎所有命 ...

  5. INITTAB 配置文件

    Inittab 文件详解       init的进程号是1(ps -aux | less),从这一点就能看出,init进程是系统所有进程的起点,Linux在完成核内引导以后,就开始运行init程序. ...

  6. php 运行的四种模式

    1)cgi 通用网关接口(Common Gateway Interface)) CGI即通用网关接口(Common Gateway Interface),它是一段程序, 通俗的讲CGI就象是一座桥,把 ...

  7. 动态求区间K大值(权值线段树)

    我们知道我们可以通过主席树来维护静态区间第K大值.我们又知道主席树满足可加性,所以我们可以用树状数组来维护主席树,树状数组的每一个节点都可以开一颗主席树,然后一起做. 我们注意到树状数组的每一棵树都和 ...

  8. MySQL:表的操作 知识点难点总结:表完整性约束及其他常用知识点二次总结🙄

    表操作 一 : 修改表表表表表表表表表: ALTER TABLE 语法 1. 改表名rename alter table 表名 rename 新表名 2. 增加字段add alter table 表名 ...

  9. 【JavaScript 】for 循环进化史

    ECMAScript 6已经逐渐普及,经过二十多年的改进,很多功能也有了更成熟的语句,比如 for 循环 这篇博客将介绍一下从最初的 for 循环,到 ES6 的 for-of 等四种遍历方法 先定义 ...

  10. Sp_Lock

    SP_LOCK 其显示信息为: Spid:进程ID号(要发现哪些用户和该spid相连,你就要执行存储过程sp_who) Dbid:数据库ID号(可以在主数据库中的sysdatabases表格中找到它) ...