rt,大佬们也可以给一些点分治好题(玄关)
``#include<bits/stdc++.h>
#define int long long
using namespace std;
int sum,n,m,u,v,w,id;
int head[100005],cnt,dp[100005],dis[100005],dis2[100005],q[100005],qu[100005],b[100005],sums,maxp[100005];
bool vis[100005],vis2[10000005];
struct node{
int to,nxt,w;
}e[200005];
void add(int x,int y,int w){
e[++cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
e[cnt].w=w;
}
void dfs1(int x,int pre){
maxp[x]=0;
dis[x]=1;
for(register int i=head[x];i;i=e[i].nxt){
if(e[i].to==pre||vis[e[i].to]){
continue;
}
dfs1(e[i].to,x);
dis[x]+=dis[e[i].to];
maxp[x]=max(maxp[x],dis[e[i].to]+1);
}
maxp[x]=max(maxp[x],sums-dis[x]-1);
if(maxp[x]<maxp[id]){
id=x;
}
}
void dfs2(int x,int pre){
dp[++dp[0]]=dis2[x];
for(register int i=head[x];i;i=e[i].nxt){
if(e[i].to==pre||vis[e[i].to]){
continue;
}
dis2[e[i].to]=dis2[x]+e[i].w;
dfs2(e[i].to,x);
}
}
void solve(int rt){
vis[rt]=1;
vis2[0]=1;
int pos=0;
for(register int i=head[rt];i;i=e[i].nxt){
if(vis[e[i].to]){
continue;
}
dp[0]=0;
dis2[e[i].to]=e[i].w;
dfs2(e[i].to,rt);
for(register int j=dp[0];j;j--){
for(register int k=1;k<=m;k++){
if(q[k]>=dp[j]){
if(vis2[q[k]-dp[j]]){
qu[k]=1;
}
}
}
}
for(register int j=dp[0];j;j--){
vis2[dp[j]]=1;
b[++pos]=dp[j];
}
}
for(register int i=1;i<=pos;i++){
vis2[dp[i]]=0;
}
for(register int i=head[rt];i;i=e[i].nxt){
if(vis[e[i].to]){
continue;
}
id=0;
maxp[0]=1e9;
sums=dis[e[i].to];
dfs1(e[i].to,0);
solve(id);
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(register int i=1;i<=n-1;i++){
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
for(register int i=1;i<=m;i++){
cin>>q[i];
}
id=0,maxp[0]=1e9;sum=n;
dfs1(1,0);
solve(id);
for(register int i=1;i<=m;i++){
if(qu[i]){
cout<<"AYE"<<'\n';
}
else{
cout<<"NAY"<<'\n';
}
}
return 0;
}