結果

問題 No.1718 Random Squirrel
ユーザー lam6er
提出日時 2025-03-26 15:54:03
言語 PyPy3
(7.3.15)
結果
WA  
実行時間 -
コード長 3,595 bytes
コンパイル時間 335 ms
コンパイル使用メモリ 82,736 KB
実行使用メモリ 133,756 KB
最終ジャッジ日時 2025-03-26 15:54:49
合計ジャッジ時間 10,432 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 2
other AC * 10 WA * 21
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import sys
from collections import deque
def main():
sys.setrecursionlimit(1 << 25)
input = sys.stdin.read().split()
idx = 0
N, K = int(input[idx]), int(input[idx+1])
idx += 2
edges = [[] for _ in range(N + 1)]
for _ in range(N - 1):
u = int(input[idx])
v = int(input[idx + 1])
edges[u].append(v)
edges[v].append(u)
idx += 2
D = list(map(int, input[idx:idx + K]))
idx += K
if K == 1:
d1 = D[0]
dist = [-1] * (N + 1)
q = deque()
q.append(d1)
dist[d1] = 0
while q:
u = q.popleft()
for v in edges[u]:
if dist[v] == -1:
dist[v] = dist[u] + 1
q.append(v)
for x in range(1, N + 1):
print(dist[x])
return
parent = [0] * (N + 1)
depth = [0] * (N + 1)
q = deque()
root = 1
q.append(root)
parent[root] = 0
depth[root] = 0
visited = [False] * (N + 1)
visited[root] = True
while q:
u = q.popleft()
for v in edges[u]:
if not visited[v] and v != parent[u]:
parent[v] = u
depth[v] = depth[u] + 1
visited[v] = True
q.append(v)
LOG = 20
up = [[0] * (N + 1) for _ in range(LOG)]
up[0] = parent
for k in range(1, LOG):
for v in range(1, N + 1):
up[k][v] = up[k-1][up[k-1][v]]
def lca(u, v):
if depth[u] < depth[v]:
u, v = v, u
for k in reversed(range(LOG)):
if depth[u] - (1 << k) >= depth[v]:
u = up[k][u]
if u == v:
return u
for k in reversed(range(LOG)):
if up[k][u] != up[k][v]:
u = up[k][u]
v = up[k][v]
return parent[u]
S = D
s = S[0]
max_dist = -1
u = s
dist = [-1] * (N + 1)
q = deque([s])
dist[s] = 0
while q:
current = q.popleft()
for neighbor in edges[current]:
if dist[neighbor] == -1:
dist[neighbor] = dist[current] + 1
q.append(neighbor)
for node in S:
if dist[node] > max_dist:
max_dist = dist[node]
u = node
dist = [-1] * (N + 1)
q = deque([u])
dist[u] = 0
while q:
current = q.popleft()
for neighbor in edges[current]:
if dist[neighbor] == -1:
dist[neighbor] = dist[current] + 1
q.append(neighbor)
max_dist = -1
v = u
for node in S:
if dist[node] > max_dist:
max_dist = dist[node]
v = node
A = u
B = v
current_lca = S[0]
for node in S[1:]:
current_lca = lca(current_lca, node)
R = current_lca
edge_set = set()
for node in S:
current = node
while current != R:
p = parent[current]
a = min(current, p)
b = max(current, p)
edge_set.add((a, b))
current = p
E = len(edge_set)
def bfs(start):
dist = [-1] * (N + 1)
q = deque([start])
dist[start] = 0
while q:
u = q.popleft()
for v in edges[u]:
if dist[v] == -1:
dist[v] = dist[u] + 1
q.append(v)
return dist
dist_A = bfs(A)
dist_B = bfs(B)
for x in range(1, N + 1):
max_d = max(dist_A[x], dist_B[x])
res = 2 * E - max_d
print(res)
if __name__ == "__main__":
main()
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0