第一个样例下下来自己跑没有问题,但上去就TLE了!!
看到讨论区很多人都这样但是没有人回复,前来请大佬出山帮忙看看!!
代码:(马蜂不毒)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e7+10;
const int N=1e4+100;
const int M=1e6;
struct node{
int nxt,to,w;
}e[N*2];
int head[N],S;
int size[N],dep[N],d[N],vis[N],cnt,f[N],root;
int n,m,k;
void add(int u,int v,int z){
e[++cnt].nxt=head[u];
head[u]=cnt;
e[cnt].to=v;
e[cnt].w=z;
}
void get_root(int u,int father){
size[u]=1;
f[u]=0;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v!=father&&!vis[v]){
get_root(v,u);
size[u]+=size[v];
f[u]=max(f[u],size[v]);
}
}
f[u]=max(f[u],S-size[u]);
if(f[u]<f[root]){
root=u;
}
}
void get_dep(int u,int fa){
dep[++dep[0]]=d[u];
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(v!=fa&&!vis[v]){
d[v]=d[u]+e[i].w;
get_dep(v,u);
}
}
}
int ans[maxn];
int get_sum(int u,int dis,int w){
d[u]=dis;
dep[0]=0;
get_dep(u,0);
for(int i=1;i<=dep[0];i++){
for(int j=1;j<=dep[0];j++){
if(i!=j){
ans[dep[i]+dep[j]]+=w;
}
}
}
}
void solve(int u){
get_sum(u,0,1);
vis[u]=1;
for(int i=head[u];i;i=e[i].nxt){
int v=e[i].to;
if(!vis[v]){
get_sum(v,e[i].w,-1);
root=0;
f[root]=n;
S=size[v];
get_root(v,u);
solve(root);
}
}
}
int main(){
freopen("test.in","r",stdin);
freopen("test.out","w",stdout);
scanf("%d %d",&n,&m);
int a,b,c;
for(int i=1;i<n;i++){
scanf("%d %d %d",&a,&b,&c);
add(a,b,c);
add(b,a,c);
}
S=n;
root=0,f[0]=n;
get_root(1,0);
solve(root);
for(int i=1;i<=m;i++){
scanf("%d",&k);
if(ans[k]){
printf("AYE\n");
}else{
printf("NAY\n");
}
}
return 0;
}