結果
問題 | No.2337 Equidistant |
ユーザー |
![]() |
提出日時 | 2023-06-02 20:18:36 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 516 ms / 4,000 ms |
コード長 | 2,881 bytes |
コンパイル時間 | 2,907 ms |
コンパイル使用メモリ | 179,092 KB |
実行使用メモリ | 42,264 KB |
最終ジャッジ日時 | 2024-12-28 15:49:01 |
合計ジャッジ時間 | 11,527 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 1 |
other | AC * 28 |
ソースコード
#include <bits/stdc++.h>using namespace std;const int LOG = 17;struct lowest_common_ancestor{vector<int> d;vector<vector<int>> pp;lowest_common_ancestor(vector<int> &p, vector<int> &d): d(d){int N = p.size();pp = vector<vector<int>>(LOG, vector<int>(N, -1));pp[0] = p;for (int i = 0; i < LOG - 1; i++){for (int j = 0; j < N; j++){if (pp[i][j] != -1){pp[i + 1][j] = pp[i][pp[i][j]];}}}}int la(int v, int x){for (int i = 0; i < LOG; i++){if ((x >> i & 1) == 1){v = pp[i][v];}}return v;}int lca(int u, int v){if (d[u] > d[v]){swap(u, v);}v = la(v, d[v] - d[u]);if (u == v){return u;}for (int i = LOG - 1; i >= 0; i--){if (pp[i][u] != pp[i][v]){u = pp[i][u];v = pp[i][v];}}return pp[0][u];}};int main(){ios_base::sync_with_stdio(false);cin.tie(nullptr);int N, Q;cin >> N >> Q;vector<vector<int>> E(N);for (int i = 0; i < N - 1; i++){int A, B;cin >> A >> B;A--;B--;E[A].push_back(B);E[B].push_back(A);}vector<int> p(N, -1);vector<vector<int>> c(N);vector<int> d(N, 0);queue<int> q;q.push(0);vector<int> bfs;while (!q.empty()){int v = q.front();q.pop();bfs.push_back(v);for (int w : E[v]){if (w != p[v]){p[w] = v;c[v].push_back(w);d[w] = d[v] + 1;q.push(w);}}}reverse(bfs.begin(), bfs.end());vector<int> dp(N, 1);for (int v : bfs){for (int w : c[v]){dp[v] += dp[w];}}vector<vector<int>> pp(LOG, vector<int>(N, -1));pp[0] = p;for (int i = 0; i < LOG - 1; i++){for (int j = 0; j < N; j++){if (pp[i][j] != -1){pp[i + 1][j] = pp[i][pp[i][j]];}}}auto la = [&](int v, int x){for (int i = 0; i < LOG; i++){if ((x >> i & 1) == 1){v = pp[i][v];}}return v;};auto lca = [&](int u, int v){if (d[u] > d[v]){swap(u, v);}v = la(v, d[v] - d[u]);if (u == v){return u;}for (int i = LOG - 1; i >= 0; i--){if (pp[i][u] != pp[i][v]){u = pp[i][u];v = pp[i][v];}}return pp[0][u];};for (int i = 0; i < Q; i++){int S, T;cin >> S >> T;S--;T--;if (d[S] > d[T]){swap(S, T);}if (d[S] % 2 != d[T] % 2){cout << 0 << '\n';} else {int V = lca(S, T);if (d[S] == d[T]){int s = la(S, d[S] - d[V] - 1);int t = la(T, d[T] - d[V] - 1);cout << N - dp[s] - dp[t] << '\n';} else {int D = d[S] + d[T] - d[V] * 2;int s = la(T, D / 2);int t = la(T, D / 2 - 1);cout << dp[s] - dp[t] << '\n';}}}}