結果
| 問題 |
No.2337 Equidistant
|
| コンテスト | |
| ユーザー |
SSRS
|
| 提出日時 | 2022-08-22 23:03:39 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
TLE
|
| 実行時間 | - |
| コード長 | 1,644 bytes |
| コンパイル時間 | 1,719 ms |
| コンパイル使用メモリ | 177,308 KB |
| 実行使用メモリ | 52,792 KB |
| 最終ジャッジ日時 | 2024-11-17 02:10:15 |
| 合計ジャッジ時間 | 28,002 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 25 TLE * 3 |
ソースコード
#include <bits/stdc++.h>
using namespace std;
int main(){
int N, Q;
cin >> N >> Q;
vector<vector<int>> E(N);
for (int i = 0; i < N - 1; i++){
int U, V;
cin >> U >> V;
U--;
V--;
E[U].push_back(V);
E[V].push_back(U);
}
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];
}
}
auto naive_lca = [&](int u, int v){
while (d[u] > d[v]){
u = p[u];
}
while (d[v] > d[u]){
v = p[v];
}
while (u != v){
u = p[u];
v = p[v];
}
return u;
};
auto naive_la = [&](int v, int k){
for (int i = 0; i < k; i++){
v = p[v];
}
return v;
};
for (int i = 0; i < Q; i++){
int A, B;
cin >> A >> B;
A--;
B--;
if (d[A] > d[B]){
swap(A, B);
}
if (d[A] % 2 != d[B] % 2){
cout << 0 << endl;
} else {
int C = naive_lca(A, B);
if (d[A] == d[B]){
int A2 = naive_la(A, d[A] - d[C] - 1);
int B2 = naive_la(B, d[B] - d[C] - 1);
cout << N - dp[A2] - dp[B2] << endl;
} else {
int D = d[A] + d[B] - d[C] * 2;
int X = naive_la(B, D / 2);
int Y = naive_la(B, D / 2 - 1);
cout << dp[X] - dp[Y] << endl;
}
}
}
}
SSRS