結果
問題 | No.1718 Random Squirrel |
ユーザー |
![]() |
提出日時 | 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 |
ソースコード
import sysfrom collections import dequedef main():sys.setrecursionlimit(1 << 25)input = sys.stdin.read().split()idx = 0N, K = int(input[idx]), int(input[idx+1])idx += 2edges = [[] 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 += 2D = list(map(int, input[idx:idx + K]))idx += Kif K == 1:d1 = D[0]dist = [-1] * (N + 1)q = deque()q.append(d1)dist[d1] = 0while q:u = q.popleft()for v in edges[u]:if dist[v] == -1:dist[v] = dist[u] + 1q.append(v)for x in range(1, N + 1):print(dist[x])returnparent = [0] * (N + 1)depth = [0] * (N + 1)q = deque()root = 1q.append(root)parent[root] = 0depth[root] = 0visited = [False] * (N + 1)visited[root] = Truewhile q:u = q.popleft()for v in edges[u]:if not visited[v] and v != parent[u]:parent[v] = udepth[v] = depth[u] + 1visited[v] = Trueq.append(v)LOG = 20up = [[0] * (N + 1) for _ in range(LOG)]up[0] = parentfor 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, ufor k in reversed(range(LOG)):if depth[u] - (1 << k) >= depth[v]:u = up[k][u]if u == v:return ufor k in reversed(range(LOG)):if up[k][u] != up[k][v]:u = up[k][u]v = up[k][v]return parent[u]S = Ds = S[0]max_dist = -1u = sdist = [-1] * (N + 1)q = deque([s])dist[s] = 0while q:current = q.popleft()for neighbor in edges[current]:if dist[neighbor] == -1:dist[neighbor] = dist[current] + 1q.append(neighbor)for node in S:if dist[node] > max_dist:max_dist = dist[node]u = nodedist = [-1] * (N + 1)q = deque([u])dist[u] = 0while q:current = q.popleft()for neighbor in edges[current]:if dist[neighbor] == -1:dist[neighbor] = dist[current] + 1q.append(neighbor)max_dist = -1v = ufor node in S:if dist[node] > max_dist:max_dist = dist[node]v = nodeA = uB = vcurrent_lca = S[0]for node in S[1:]:current_lca = lca(current_lca, node)R = current_lcaedge_set = set()for node in S:current = nodewhile current != R:p = parent[current]a = min(current, p)b = max(current, p)edge_set.add((a, b))current = pE = len(edge_set)def bfs(start):dist = [-1] * (N + 1)q = deque([start])dist[start] = 0while q:u = q.popleft()for v in edges[u]:if dist[v] == -1:dist[v] = dist[u] + 1q.append(v)return distdist_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_dprint(res)if __name__ == "__main__":main()