ignited @ 2021-09-07 15:27:31
#include<bits/stdc++.h>
#define MAXN 10010
#define MAXM 10000010
using namespace std;
struct edge
{
int to,val;
};
int n,m,sum,root,tot,size[MAXN],dp[MAXN],vis[MAXN],dis[MAXN],rev[MAXN],query[MAXN],d[MAXN];
bool pd[MAXM],bin[MAXM];
vector<edge> g[MAXN];
inline void getroot(int u,int f)
{
dp[u]=0,size[u]=1;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].to;
if(v==f||vis[v]) continue;
getroot(v,u);
size[u]+=size[v];
dp[u]=max(dp[u],size[v]);
}
dp[u]=max(dp[u],sum-size[u]);
if(dp[u]<dp[root]) root=u;
}
inline void getdis(int u,int f)
{
rev[++tot]=dis[u];
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].to;
if(vis[v]||v==f) continue;
dis[v]=dis[u]+g[u][i].val;
getdis(v,u);
}
}
inline void solve(int u)
{
int c=0;
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].to;
if(vis[v]) continue;
dis[v]=g[u][i].val,tot=0;
getdis(v,u);
for(int j=1;j<=tot;j++)
for(int k=1;k<=m;k++)
if(query[k]>=rev[j]) bin[query[k]]|=pd[query[k]-rev[j]];
for(int j=1;j<=tot;j++) if(rev[j]<=10000000) d[++c]=rev[j],pd[rev[j]]=1;
}
for(int i=1;i<=c;i++) pd[d[i]]=0;
}
inline void divid(int u)
{
vis[u]=pd[0]=1;
solve(u);
for(int i=0;i<g[u].size();i++)
{
int v=g[u][i].to;
if(vis[v]) continue;
dp[0]=n,sum=size[v],root=0;
getroot(v,u);
divid(v);
}
}
int main()
{
cin>>n>>m;
dp[0]=n;root=0;
for(int i=1;i<n;i++)
{
int u,v,w;
scanf("%d%d%d",&u,&v,&w);
g[u].push_back((edge){v,w});
g[v].push_back((edge){u,w});
}
for(int i=1;i<=m;i++) scanf("%d",&query[i]);
getroot(1,0);
divid(root);
for(int i=1;i<=m;i++)
if(bin[query[i]]) puts("AYE");
else puts("NAY");
return 0;
}
是STL太卡吗
by dottle @ 2021-09-07 15:32:40
@ignited 你淀粉质递归应该走 root 而不是 v。
by ignited @ 2021-09-07 15:37:01
@dottle 感谢,差错一直查不出来
by HugeWide @ 2021-09-07 20:02:32
这递归走错了自己根本测不出来(因为它答案不改变,但是复杂度爆炸