淀粉质

中工业

#include<bits/stdc++.h>
#define F(i0,i1,i2) for(int i0=(i1);i0<=(i2);++i0)
#define int long long
#define pii pair<int,int>
#define fr first
#define sc second
using namespace std;
inline int rd(){
    int f=0,x=0;char ch=getchar();
    while(!isdigit(ch)){if(ch=='-')f=1;ch=getchar();}
    while(isdigit(ch)){x=(x<<1)+(x<<3)+ch-48;ch=getchar();}
    return f?-x:x;
}
const int N=1e7+7,inf=1e7;
struct Id{int v,w,nt;}e[N<<1];
int p[N],id=1;
void add(int x,int y,int z){e[++id]={y,z,p[x]};p[x]=id;}
int qe[N];
int n,m;
int vis[N];
int mxp[N],siz[N],rt,sum;//sum是当前处理范围的树大小
void getrt(int x,int ffa){
    siz[x]=1,mxp[x]=0;
    for(int i=p[x];i;i=e[i].nt){
        int v=e[i].v;
        if(v==ffa||vis[v])continue;
        getrt(v,x);
        siz[x]+=siz[v];
        mxp[x]=max(siz[v],mxp[x]);
    }
    mxp[x]=max(sum-siz[x],mxp[x]);
    if(mxp[x]<mxp[rt])rt=x;
}
int jud[N];//某长度的路径是否存在 
int rem[N];//rem[0]->rem的长度 处理出来到根的距离  
int dis[N];
void getdis(int x,int ffa){
    rem[++rem[0]]=dis[x];
    for(int i=p[x];i;i=e[i].nt){
        int v=e[i].v;
        if(v==ffa||vis[v])continue;
        dis[v]=dis[x]+e[i].w;
        getdis(v,x);
    }
}
int test[N];
int q[N];
void calc(int x){
    int ql=0;
    for(int i=p[x];i;i=e[i].nt){
        int v=e[i].v;
        if(vis[v])continue;
        rem[0]=0;
        dis[v]=e[i].w;
        getdis(v,x);
        for(int j=rem[0];j;--j)
            for(int k=1;k<=m;++k)
                if(qe[k]>=rem[j])
                    test[k]|=jud[qe[k]-rem[j]];

        for(int j=rem[0];j;--j)
            q[++ql]=rem[j],jud[rem[j]]=1;

    }
    F(i,1,ql)jud[q[i]]=0;
}
void solve(int x){
    jud[0]=vis[x]=1;
    calc(x);
    for(int i=p[x];i;i=e[i].nt){
        int v=e[i].v;
        if(vis[v])continue;
        sum=siz[v];mxp[rt=0]=inf;
        getrt(v,0);
        solve(rt);
    }
}
signed main(){
    n=rd(),m=rd();
    F(i,1,n-1){
        int x=rd(),y=rd(),z=rd();
        add(x,y,z);
        add(y,x,z);
    }
    F(i,1,m)qe[i]=rd();
    mxp[rt]=sum=n;
    getrt(1,0);
    solve(rt);
    F(i,1,m){
        if(test[i])puts("AYE");
        else puts("NAY");
    }
    return 0;
}
posted @ 2023-09-09 17:08  ussumer  阅读(32)  评论(0)    收藏  举报