rt,有一个答案存在但没找到,貌似和这个错误一样
#include <bits/stdc++.h>
#define MISAKA main
#define ll long long
using namespace std;
inline int read(){
char ch=getchar();int f=1,x=0;
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
return x*f;
}
const double eps=1e-9;
const int N=1e4+10,inf=1e9,mod=998244353;
bitset<N*N> b;vector<int> d;
int siz[N],vis[N],dep[N],rt,mn,n,m,k[N],ans[N];
struct edge{int to,next,w;}e[N<<1];
int head[N],ecnt=1;
void add_edge(int u,int v,int w){
e[++ecnt].to=v;
e[ecnt].w=w;
e[ecnt].next=head[u];
head[u]=ecnt;
}
int getsiz(int u,int fa){
int s=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v!=fa&&!vis[v]) s+=getsiz(v,u);
}
return s;
}
void getrt(int u,int fa,int s){
siz[u]=1;int mx=0;
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(vis[v]||v==fa) continue;
getrt(v,u,s),siz[u]+=siz[v];
mx=max(mx,siz[v]);
}
mx=max(mx,s-siz[u]);
if(mx<mn) mn=mx,rt=u;
}
void getdep(int u,int fa){
d.push_back(dep[u]);
for(int i=head[u];i;i=e[i].next){
int v=e[i].to;
if(v!=fa&&!vis[v])
dep[v]=dep[u]+e[i].w,getdep(v,u);
}
}
void solve(int u,int fa){
int s=getsiz(u,fa),p=0;
mn=inf,rt=0;getrt(u,fa,s);
vis[rt]=1,dep[rt]=0,b[0]=1;
for(int i=head[rt];i;i=e[i].next){
int v=e[i].to;
if(v==fa||vis[v]) continue;
dep[v]=e[i].w,getdep(v,u);
for(int j=p;j<d.size();j++)
for(int q=1;q<=m;q++)
if(k[q]>=d[j]) ans[q]|=b[k[q]-d[j]];
for(int j=p;j<d.size();j++) b[d[j]]=1;
p=d.size();
}
for(int i=0;i<d.size();i++) b[d[i]]=0;
d.clear();
for(int i=head[rt];i;i=e[i].next){
int v=e[i].to;
if(v!=fa&&!vis[v]) solve(v,rt);
}
}
signed MISAKA(){
n=read(),m=read();
for(int i=1;i<n;i++){
int u=read(),v=read(),w=read();
add_edge(u,v,w);
add_edge(v,u,w);
}
for(int i=1;i<=m;i++) k[i]=read();
solve(1,0);
for(int i=1;i<=m;i++) printf("%s\n",ans[i]?"AYE":"NAY");
return 0;
}
/*
6 10
1 2 2
2 3 3
1 4 5
4 5 1
4 6 2
1 2 3 4 5 6 7 8 9 10
*/