题面
https://www.luogu.org/problem/P3806
题解
#include<cstdio> #include<algorithm> #include<iostream> #include<vector> #define p rem[0] using namespace std; const int maxn=10500; const int inf=10000000; int n,m; vector<int> to[maxn],len[maxn]; int tot,head[maxn]; int maxp[maxn],siz[maxn],dis[maxn],rem[maxn]; int vis[maxn],test[inf],judge[inf],q[maxn]; int query[1010]; int sum,root,ans; void dfs(int now,int ff) { siz[now]=1; maxp[now]=0; int i,l=to[now].size(); for (i=0;i<l;i++) if (to[now][i]!=ff && !vis[to[now][i]]) { dfs(to[now][i],now); siz[now]+=siz[to[now][i]]; maxp[now]=max(maxp[now],siz[to[now][i]]); } maxp[now]=max(maxp[now],sum-siz[now]); if (maxp[now]<maxp[root]) root=now; } void dfs2(int now,int ff) { rem[++p]=dis[now]; int i,l=to[now].size(); for (i=0;i<l;i++) if (to[now][i]!=ff && !vis[to[now][i]]) { dis[to[now][i]]=dis[now]+len[now][i]; dfs2(to[now][i],now); } } void calc(int now) { int pp=0,i,j,k,l=to[now].size(); for (i=0;i<l;i++) if (!vis[to[now][i]]) { p=0; dis[to[now][i]]=len[now][i]; dfs2(to[now][i],now); for (j=1;j<=p;j++) for (k=1;k<=m;k++) if (query[k]>=rem[j]) test[k]|=judge[query[k]-rem[j]]; for (j=1;j<=p;j++) q[++pp]=rem[j],judge[rem[j]]=1; } for (i=1;i<=pp;i++) judge[q[i]]=false; } void solve(int now) { int i,l=to[now].size(); vis[now]=judge[0]=1; calc(now); for (i=0;i<l;i++) if (!vis[to[now][i]]) { sum=siz[to[now][i]]; maxp[root=0]=inf; dfs(to[now][i],0); solve(root); } } int main() { int i,u,v,d; scanf("%d %d",&n,&m); for (i=1;i<n;i++) { scanf("%d %d %d",&u,&v,&d); to[u].push_back(v); len[u].push_back(d); to[v].push_back(u); len[v].push_back(d); } for (i=1;i<=m;i++) scanf("%d",&query[i]); maxp[root=0]=sum=n; dfs(1,0); solve(root); for (i=1;i<=m;i++) { if (test[i]) puts("AYE"); else puts("NAY"); } return 0; }