結果
| 問題 |
No.2337 Equidistant
|
| コンテスト | |
| ユーザー |
shobonvip
|
| 提出日時 | 2023-06-03 01:51:34 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 1,201 ms / 4,000 ms |
| コード長 | 2,535 bytes |
| コンパイル時間 | 4,349 ms |
| コンパイル使用メモリ | 254,080 KB |
| 最終ジャッジ日時 | 2025-02-13 21:58:52 |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 1 |
| other | AC * 28 |
ソースコード
#include<bits/stdc++.h>
#include<atcoder/all>
using namespace std;
using namespace atcoder;
typedef modint998244353 mint;
typedef long long ll;
int main(){
int n, q; cin >> n >> q;
vector<vector<int>> ikeru(n, vector<int>(0));
for (int i=0; i<n-1; i++){
int a, b; cin >> a >> b;
a--; b--;
ikeru[a].push_back(b);
ikeru[b].push_back(a);
}
vector<vector<int>> db(30, vector<int>(n, -1));
vector<int> mada = {~0, 0};
vector<int> tansaku(n);
tansaku[0] = 1;
vector<int> siz(n);
vector<int> depth(n);
while(!mada.empty()){
int i = mada.back();
mada.pop_back();
if (i >= 0){
for (int j: ikeru[i]){
if (tansaku[j] == 0){
tansaku[j] = 1;
db[0][j] = i;
depth[j] = depth[i] + 1;
mada.push_back(~j);
mada.push_back(j);
}
}
}else{
i = ~i;
int tmp = 1;
for (int j: ikeru[i]){
if (tansaku[j] == 2){
tmp += siz[j];
}
}
tansaku[i] = 2;
siz[i] = tmp;
}
}
for (int i=0; i<29; i++){
for (int j=0; j<n; j++){
if (db[i][j] == -1) continue;
db[i+1][j] = db[i][db[i][j]];
}
}
for (int i=0; i<q; i++){
int s, t;
cin >> s >> t;
s--; t--;
// lca
int x = s, y = t;
if (depth[x] < depth[y]){
swap(x, y);
}
int dist = 0;
if (depth[x] > depth[y]){
int k = depth[x] - depth[y];
for (int j=0; j<30; j++){
if (k >> j & 1){
x = db[j][x];
dist += 1 << j;
}
}
}
if (x != y){
for (int j=29; j>=0; j--){
if (db[j][x] == -1) continue;
if (db[j][x] != db[j][y]){
x = db[j][x];
y = db[j][y];
dist += 1 << j+1;
}
}
}
if (x != y){
x = db[0][x];
dist += 2;
}
if (dist % 2 == 1){
cout << 0 << "\n";
}else{
if (x == s || x == t){
if (x == t) swap(s, t);
int w = t, g = dist / 2 - 1;
for (int j=0; j<30; j++){
if (g >> j & 1){
w = db[j][w];
}
}
int ans = 0;
ans -= siz[w];
w = db[0][w];
ans += siz[w];
cout << ans << "\n";
}else if(depth[s] != depth[t]){
if (depth[s] > depth[t]){
swap(s, t);
}
int w = t, g = dist / 2 - 1;
for (int j=0; j<30; j++){
if (g >> j & 1){
w = db[j][w];
}
}
int ans = 0;
ans -= siz[w];
w = db[0][w];
ans += siz[w];
cout << ans << "\n";
}else{
int v = t, w = s;
int g = dist / 2 - 1;
for (int j=0; j<30; j++){
if (g >> j & 1){
w = db[j][w];
v = db[j][v];
}
}
int ans = 0;
ans = n;
ans -= siz[w];
ans -= siz[v];
cout << ans << "\n";
}
}
}
}
shobonvip