提出 #5581449
ソースコード 拡げる
import sys
input = sys.stdin.readline
sys.setrecursionlimit(10**6)
U = 17
N = int(input())
edge = [[] for _ in range(N+1)]
for _ in range(N-1):
x,y = map(int,input().split())
edge[x].append(y)
edge[y].append(x)
# 頂点xから根に向かって2**i進んだ到達点
# 行き過ぎている場合は0
go_back = [[0]*U for _ in range(N+1)]
depth = [0] * (N+1)
def set(x,d,p):
depth[x] = d
go_back[x][0] = p
for i in range(1,U):
go_back[x][i] = go_back[go_back[x][i-1]][i-1]
if go_back[x][i] == 0:
break
for y in edge[x]:
if y == p:
continue
set(y,d+1,x)
set(1,0,0)
def calc_dist_same_depth(x,y):
if x == y:
return 0
j = 0
while go_back[x][j] != go_back[y][j]:
j += 1
if j == 0:
return 2
rx = go_back[x][j-1]
ry = go_back[y][j-1]
return calc_dist_same_depth(rx,ry) + (1<<j)
def calc_dist(x,y):
dx = depth[x]
dy = depth[y]
d = dy - dx
if d < 0:
d = -d
x,y = y,x
result = d
j = 0
while d:
bit = 1<<j
if d&bit:
y = go_back[y][j]
d ^= bit
j += 1
return calc_dist_same_depth(x,y) + result
Q = int(input())
for _ in range(Q):
a,b = map(int,input().split())
print(calc_dist(a,b)+1)
提出情報
ジャッジ結果
| セット名 | Sample | Subtask1 | Subtask2 | ||||||
|---|---|---|---|---|---|---|---|---|---|
| 得点 / 配点 | 0 / 0 | 30 / 30 | 70 / 70 | ||||||
| 結果 |
|
|
|
| セット名 | テストケース |
|---|---|
| Sample | subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt |
| Subtask1 | subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt |
| Subtask2 | subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt |
| ケース名 | 結果 | 実行時間 | メモリ |
|---|---|---|---|
| subtask0_sample01.txt | AC | 17 ms | 3188 KiB |
| subtask0_sample02.txt | AC | 17 ms | 3188 KiB |
| subtask0_sample03.txt | AC | 17 ms | 3188 KiB |
| subtask1_01.txt | AC | 952 ms | 134652 KiB |
| subtask1_02.txt | AC | 964 ms | 134652 KiB |
| subtask1_03.txt | AC | 17 ms | 3188 KiB |
| subtask1_04.txt | AC | 18 ms | 3188 KiB |
| subtask1_05.txt | AC | 23 ms | 3444 KiB |
| subtask1_06.txt | AC | 23 ms | 3700 KiB |
| subtask1_07.txt | AC | 584 ms | 43316 KiB |
| subtask1_08.txt | AC | 608 ms | 43184 KiB |
| subtask1_09.txt | AC | 708 ms | 43312 KiB |
| subtask1_10.txt | AC | 759 ms | 44832 KiB |
| subtask1_11.txt | AC | 812 ms | 46044 KiB |
| subtask1_12.txt | AC | 708 ms | 44460 KiB |
| subtask2_01.txt | AC | 1594 ms | 135492 KiB |
| subtask2_02.txt | AC | 1588 ms | 135504 KiB |
| subtask2_03.txt | AC | 356 ms | 4080 KiB |
| subtask2_04.txt | AC | 432 ms | 4036 KiB |
| subtask2_05.txt | AC | 650 ms | 4320 KiB |
| subtask2_06.txt | AC | 588 ms | 4368 KiB |
| subtask2_07.txt | AC | 1290 ms | 46144 KiB |
| subtask2_08.txt | AC | 1293 ms | 44116 KiB |
| subtask2_09.txt | AC | 1569 ms | 44216 KiB |
| subtask2_10.txt | AC | 1713 ms | 45524 KiB |
| subtask2_11.txt | AC | 1833 ms | 46796 KiB |
| subtask2_12.txt | AC | 1736 ms | 47024 KiB |