fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int maxn = 5e5 + 5;
  5.  
  6. vector<int> adj[maxn], g[maxn];
  7. int par[maxn][20], h[maxn], sz[maxn];
  8. int tin[maxn], tout[maxn], timeDfs = 0;
  9.  
  10. int ans[maxn];
  11.  
  12. array<int, 2> dp[maxn];
  13.  
  14. bool cmp(int u, int v){
  15. return tin[u] < tin[v];
  16. }
  17.  
  18. bool inside(int u, int v){
  19. return (tin[u] <= tin[v] && tout[v] <= tout[u]);
  20. }
  21.  
  22. void dfs(int u){
  23. tin[u] = ++timeDfs;
  24. sz[u] = 1;
  25. for(int v: adj[u]){
  26. if(v == par[u][0]) continue;
  27. par[v][0] = u;
  28. h[v] = h[u] + 1;
  29.  
  30. for(int i = 1; (1 << i) <= h[v]; i++) par[v][i] = par[par[v][i - 1]][i - 1];
  31.  
  32. dfs(v);
  33. sz[u] += sz[v];
  34. }
  35. tout[u] = timeDfs;
  36. }
  37.  
  38. int up(int u, int d){
  39. assert(d >= 0);
  40. for(int i = 0; (1 << i) <= d; i++) if((d >> i) & 1) u = par[u][i];
  41. return u;
  42. }
  43.  
  44. int lca(int u, int v){
  45. if(h[u] < h[v]) swap(u, v);
  46.  
  47. u = up(u, h[u] - h[v]);
  48.  
  49. if(u == v) return u;
  50. int lg = __lg(h[u]);
  51.  
  52. for(int i = lg; i >= 0; i--){
  53. if(par[u][i] != par[v][i]){
  54. u = par[u][i];
  55. v = par[v][i];
  56. }
  57. }
  58.  
  59. return par[u][0];
  60. }
  61.  
  62.  
  63. void solve(int u){
  64. for(int v: g[u]){
  65. solve(v);
  66. dp[u] = min(dp[u], {dp[v][0] + h[v] - h[u], dp[v][1]});
  67. }
  68. ans[dp[u][1]] += sz[u];
  69. for(int v: g[u]){
  70. if(dp[u][1] == dp[v][1]) ans[dp[u][1]] -= sz[v];
  71. else{
  72. int d = dp[u][0] + dp[v][0] + h[v] - h[u];
  73. //d = min dist u -> special vertice trong subtree u
  74. //min dist v -> special vertice trong subtree v
  75. //dist u, v
  76. if(d & 1) d /= 2;
  77. else{
  78. d /= 2;
  79. if(dp[u][1] < dp[v][1]) d--;
  80. }
  81. int mid = up(v, d - dp[v][0]);
  82. ans[dp[u][1]] -= sz[mid];
  83. ans[dp[v][1]] += sz[mid] - sz[v];
  84. }
  85. }
  86. }
  87.  
  88. void solve(){
  89. int n; cin >> n;
  90.  
  91. for(int i = 1; i <= n - 1; i++){
  92. int u, v; cin >> u >> v;
  93. adj[u].push_back(v);
  94. adj[v].push_back(u);
  95. }
  96.  
  97. dfs(1);
  98.  
  99. for(int i = 1; i <= n; i++) dp[i] = {(int)1e9, (int)1e9};
  100. int q; cin >> q;
  101. while(q--){
  102. int k; cin >> k;
  103.  
  104. vector<int> x(k + 1), v;
  105. for(int i = 1; i <= k; i++){
  106. cin >> x[i];
  107. v.push_back(x[i]);
  108. dp[x[i]] = {0, x[i]};
  109. }
  110.  
  111. sort(v.begin(), v.end(), cmp);
  112. int s = v.size();
  113. for(int i = 0; i < s - 1; i++) v.push_back(lca(v[i], v[i + 1]));
  114.  
  115. v.push_back(1);
  116. sort(v.begin(), v.end(), cmp);
  117. v.resize(unique(v.begin(), v.end()) - v.begin());
  118.  
  119. stack<int> st;
  120. for(int u: v){
  121. while(st.size() && !inside(st.top(), u)) st.pop();
  122. if(st.size()) g[st.top()].push_back(u);
  123. st.push(u);
  124. }
  125.  
  126. solve(1);
  127. for(int i = 1; i <= k; i++) cout << ans[x[i]] << " ";
  128. cout << "\n";
  129.  
  130. while(st.size()) st.pop();
  131. for(int u: v){
  132. g[u].clear();
  133. ans[u] = 0;
  134. dp[u] = {(int)1e9, (int)1e9};
  135. }
  136. v.clear();
  137. }
  138. }
  139.  
  140.  
  141.  
  142. signed main() {
  143. ios_base::sync_with_stdio(false);
  144. cin.tie(0); cout.tie(0);
  145.  
  146. solve();
  147. }
Success #stdin #stdout 0.02s 32448KB
stdin
Standard input is empty
stdout
Standard output is empty