1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
| #include <bits/stdc++.h> #define rep(i, n, m) for(int i = n; i <= m; ++i) #define per(i, n, m) for(int i = n; i >= m; --i) using namespace std; const int N = 2e5 + 10; int ne[N], w[N], e[N], head[N], cnt = 0; int n, m, root, ok[N], query[N], siz[N], mx[N], vis[N]; int tol, q[N], dist[N], col[N];
void add(int a, int b, int c){ e[++cnt] = b, w[cnt] = c, ne[cnt] = head[a], head[a] = cnt; } bool cmp(int a, int b){ return dist[a] < dist[b]; } void get_root(int u, int pre, int sum){ siz[u] = 1; mx[u] = 0; for(int i = head[u]; i; i = ne[i]){ int to = e[i]; if(to == pre || vis[to]) continue; get_root(to, u, sum); siz[u] += siz[to]; mx[u] = max(mx[u], siz[to]); } mx[u] = max(mx[u], sum - siz[u]); if(mx[u] < mx[root] || !root) root = u; } void get_dist(int u, int pre, int dis, int camp){ q[++tol] = u; dist[u] = dis; col[u] = camp; for(int i = head[u]; i; i = ne[i]){ int to = e[i]; if(to == pre || vis[to]) continue; get_dist(to, u, w[i] + dis, camp); } } void cal(int u){ tol = 0; q[++ tol] = u; dist[u] = 0; col[u] = u; for(int i = head[u]; i ; i = ne[i]){ int to = e[i]; if(!vis[to]) get_dist(to, u, w[i], to); } sort(q + 1, q + 1 + tol, cmp); rep(i, 1, m){ int l = 1, r = tol; if(ok[i]) continue; while(l < r){ int x = q[l], y = q[r]; if(dist[x] + dist[y] < query[i]){ l ++; }else if(dist[x] + dist[y] > query[i]){ r --; }else if(col[x] == col[y]){ if(col[y] == col[q[r - 1]]) r --; else l ++; }else { ok[i] = 1; break; } } } } void solve(int u){ vis[u] = 1; cal(u); for(int i = head[u]; i; i = ne[i]){ int to = e[i]; if(!vis[to]){ root = 0; get_root(to, 0, siz[to]); solve(root); } } } int main() { cin >> n >> m; rep(i, 1, n - 1){ int u, v, w; cin >> u >> v >> w; add(u, v, w); add(v, u, w); } rep(i, 1, m){ cin >> query[i]; } mx[0] = n; get_root(1, 0, n); solve(root); rep(i, 1, m){ if(ok[i]) cout << "AYE" << '\n'; else cout << "NAY" << '\n'; } return 0; }
|