#include<bits/stdc++.h> usingnamespace std; constint N = 1e4+4; structEdge{ int to, nxt, w; }edge[N<<1]; int h[N], cnt; void _add(int u, int v ,int w){ edge[++cnt] = {v, h[u], w}; h[u] = cnt; } voidadd(int u, int v, int w){ _add(u, v, w), _add(v, u, w); }
int vis[N]; int rt=0, n, q; int siz[N]; int maxsiz[N]; int nown; voidgetzx(int x, int fa){ //get 重心 siz[x] = 1; maxsiz[x] = 0; for(int i=h[x];i;i=edge[i].nxt){ int v = edge[i].to; if(v==fa||vis[v]) continue; getzx(v, x); siz[x] += siz[v]; maxsiz[x] = max(maxsiz[x], siz[v]); } maxsiz[x] = max(maxsiz[x], nown - siz[x]); if(maxsiz[x] < maxsiz[rt]) rt = x; } int nowtrdis[N]; int len = 0; int dis[N]; constint MAXNUM = 1e7; voidgetdis(int x, int fa){ if(dis[x] > MAXNUM) return ; nowtrdis[++len] = dis[x]; for(int i=h[x];i;i=edge[i].nxt){ int v = edge[i].to; if(v==fa||vis[v]) continue; dis[v] = dis[x] + edge[i].w; getdis(v, x); } } constint MAXN = 1e7+5; bool ans[105]; bool nowhave[MAXN]; int que[105]; int tmp[N]; voideachsolve(int x){ int tmpcnt = 0; for(int i=h[x];i;i=edge[i].nxt){ int v = edge[i].to; if(vis[v]) continue; len = 0, dis[v] = edge[i].w; getdis(v, x); for(int j=1;j<=len;j++){ for(int k=1;k<=q;k++){ if(que[k] >= nowtrdis[j]){ ans[k] |= (nowhave[que[k]-nowtrdis[j]]); } } } for(int j=1;j<=len;j++){ tmp[++tmpcnt] = nowtrdis[j]; nowhave[nowtrdis[j]] = 1; } } for(int i=1;i<=tmpcnt;i++){ nowhave[tmp[i]] = 0; } }