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 115 116 117 118 119
   | #include <bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define F first #define S second typedef long long LL; typedef pair<int, int> pii; const int N = 3e5 + 5; vector<int> g[N]; pii near[N]; int n, tot, ind, dep[N], dfn[N], sz[N], f[N][20], pos[N], h[N], t[N], st[N], fa[N], w[N], dis[N], ans[N]; bool cmp(const int &x, const int &y) {     return dfn[x] < dfn[y]; } int find(int x, int d) {     for (int i = 19; i >= 0; --i)         if (dep[f[x][i]] >= d)  x = f[x][i];     return x; } int lca(int x, int y) {     if (dep[x] < dep[y])    swap(x, y);     for (int i = 19; i >= 0; --i)         if (dep[f[x][i]] >= dep[y]) x = f[x][i];     if (x == y) return x;     for (int i = 19; i >= 0; --i)         if (f[x][i] != f[y][i]) x = f[x][i], y = f[y][i];     return f[x][0]; } void dfs(int u) {     sz[u] = 1;     dfn[u] = ++ind;     for (int i = 0, v; i < g[u].size(); ++i) {         v = g[u][i];         if (v == f[u][0])   continue;         f[v][0] = u;         for (int j = 1; j <= 19; ++j)   f[v][j] = f[f[v][j - 1]][j - 1];         dep[v] = dep[u] + 1;         dfs(v);         sz[u] += sz[v];     } } void build(int m) {     int top = 0;     sort(h + 1, h + m + 1, cmp);     for (int i = 1; i <= m; ++i) {         if (!top)   fa[st[++top] = h[i]] = 0;         else {             int x = lca(st[top], h[i]);             for (; dep[st[top]] > dep[x]; --top)                 if (dep[st[top - 1]] <= dep[x]) fa[st[top]] = x;             if (st[top] != x) {                 fa[x] = st[top];                 t[++tot] = st[++top] = x;                 near[x] = mp(0x3f3f3f3f, 0);             }             fa[st[++top] = h[i]] = x;         }     } } void work() {     tot = 0;     int m;     scanf("%d", &m);     for (int i = 1; i <= m; ++i) {         scanf("%d", &h[i]);         t[++tot] = pos[i] = h[i], ans[h[i]] = 0, near[h[i]] = mp(0, h[i]);     }     build(m);     sort(t + 1, t + tot + 1, cmp);     for (int i = 1; i <= tot; ++i) {         int x = t[i];         w[x] = sz[x];         if (i > 1)  dis[x] = dep[x] - dep[fa[x]];     }     for (int i = tot; i > 1; --i) {         int x = t[i];         near[fa[x]] = min(near[fa[x]], mp(near[x].F + dis[x], near[x].S));     }     for (int i = 2; i <= tot; ++i) {         int x = t[i];         near[x] = min(near[x], mp(near[fa[x]].F + dis[x], near[fa[x]].S));     }     for (int i = 1; i <= tot; ++i) {         int x = t[i];         if (i == 1) ans[near[x].S] += n - sz[x];         else {             int rt = find(x, dep[fa[x]] + 1);             int sum = sz[rt] - sz[x];             w[fa[x]] -= sz[rt];             if (near[fa[x]].S == near[x].S) ans[near[x].S] += sum;             else {                 int mid = dep[x] - (near[fa[x]].F - near[x].F + dis[x]) / 2;                 if ((near[fa[x]].F + near[x].F + dis[x]) % 2 == 0 && near[fa[x]].S < near[x].S) ++mid;                 int tmp = sz[find(x, mid)] - sz[x];                 ans[near[fa[x]].S] += sum - tmp;                 ans[near[x].S] += tmp;             }         }     }     for (int i = 1; i <= tot; ++i)  ans[near[t[i]].S] += w[t[i]];     for (int i = 1; i <= m; ++i)    printf("%d ", ans[pos[i]]);     puts(""); } void gao() {     scanf("%d", &n);     for (int i = 1, u, v; i < n; ++i) {         scanf("%d%d", &u, &v);         g[u].pb(v), g[v].pb(u);     }     dfs(dep[1] = 1);     int q;     scanf("%d", &q);     while (q--) work(); } int main() {     gao();     return 0; }
   |