_saltFish_ @ 2022-09-03 13:59:27
卡了好久了,就是没法过,qwq。
求大佬帮忙卡一下。
#include<iostream>
using namespace std;
const int N(1e5+5);
int n,m;
int h[N],to[N<<1],nxt[N<<1],tot,val[N<<1];
inline void add(int x,int y,int w){
nxt[++tot]=h[x],to[h[x]=tot]=y,val[tot]=w;
nxt[++tot]=h[y],to[h[y]=tot]=x,val[tot]=w;
}
int root,siz[N],dp[N]={0x7fffffff};
int sum,stk[N],top,ans[200000005];
bool vis[N];
void getroot(int u,int f){
siz[u]=1;dp[u]=0;
for(int i=h[u];i;i=nxt[i]){
int v=to[i];
if(vis[v]||v==f) continue;
getroot(v,u);
siz[u]+=siz[v];
dp[u]=max(dp[u],siz[v]);
}
dp[u]=max(dp[u],sum-siz[u]);
if(dp[u]<dp[root]) root=u;
}
void getdis(int u,int f,int dis){
stk[++top]=dis;
for(int i=h[u];i;i=nxt[i]){
int v=to[i];
if(vis[v]||v==f) continue;
getdis(v,u,dis+val[i]);
}
}
void solve(int rt,int dis,int op){
top=0;
getdis(rt,0,dis);
for(int i=1;i<=top;i++)
for(int j=i+1;j<=top;j++)
ans[stk[i]+stk[j]]+=op;
}
void divide(int u){
vis[u]=1;
solve(u,0,1);
for(int i=h[u];i;i=nxt[i]){
int v=to[i];
if(vis[v]) continue;
solve(v,val[i],-1);
root=0;sum=siz[u];
getroot(v,u);
divide(root);
}
}
int main(){
#ifdef ytxy
freopen("in.txt","r",stdin);
#endif
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<n;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
}
root=0;sum=n;
getroot(1,0);divide(root);
while(m--){
int k;
cin>>k;
cout<<((ans[k]>0)?"AYE":"NAY")<<'\n';
}
}
by gyfydkf @ 2022-10-21 14:40:23
好像这个数据出了就是卡桶的....