Noah2022 @ 2024-12-11 21:52:43
为什么只
#include<bits/stdc++.h>
#define maxn 100005
using namespace std;
struct EDGE{
int to,nxt,w;
}edge[maxn];
int head[maxn],cnt,n,m,u,v,w,k[maxn],root,siz[maxn],mx[maxn],vis[maxn],sum,ju[maxn],dis[maxn],ans[maxn],cl[maxn];
inline void add(register int u,register int v,register int w){
edge[++cnt].to=v;
edge[cnt].nxt=head[u];
edge[cnt].w=w;
head[u]=cnt;
}
inline void getroot(register const int &u,register const int &fa){
siz[u]=1;
mx[u]=0;
for(register int i=head[u];i;i=edge[i].nxt){
if(edge[i].to==fa)continue;
if(vis[edge[i].to]) continue;
getroot(edge[i].to,u);
siz[u]+=siz[edge[i].to];
mx[u]=max(mx[u],siz[edge[i].to]);
}
mx[u]=max(mx[u],sum-siz[u]);
if(mx[u]<mx[root]){
root=u;
return;
}
}
inline void getdis(register const int &id,register const int &fa){
dis[++dis[0]]=dis[id];
for(int i=head[id]; i; i=edge[i].nxt){
if(edge[i].to==fa||vis[edge[i].to]!=0){
continue;
}
dis[edge[i].to]=dis[id]+edge[i].w;
getdis(edge[i].to,id);
}
}
inline void jisuan(register const int &id){
register int nn=0;
for(register int i=head[id];i;i=edge[i].nxt){
if(vis[edge[i].to]) continue;
dis[0]=0;
dis[edge[i].to]=edge[i].w;
getdis(edge[i].to,id);
for(int j=dis[0]; j; j--){
for(int k1=1; k1<=m; k1++){
if(k[k1]>=dis[j]){
ans[k1]|=ju[k[k1]-dis[j]];
}
}
}
for(int j=dis[0]; j; j--) {
cl[++nn]=dis[j];
ju[dis[j]]=1;
}
}
for(int i=1; i<=nn;i++){
ju[cl[i]]=0;
}
}
inline void check(register const int &id){
vis[id]=ju[id]=1;
jisuan(id);
for(int i=head[id]; i; i=edge[i].nxt)
{
if(vis[edge[i].to]!=0)
{
continue;
}
sum=siz[edge[i].to];
root=0;
mx[root]=INT_MAX;
getroot(edge[i].to,0);
check(root);
}
}
int main(){
cin>>n>>m;
for(register int i=2;i<=n;i++){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
for(register int i=1;i<=m;i++){
cin>>k[i];
}
mx[root]=n;
sum=n;
getroot(1,0);
// cout<<root<<endl;
check(root);
for(int i=1; i<=m; i++){
if(ans[i]!=0){
printf("AYE\n");
}
else{
printf("NAY\n");
}
}
}