제출 #1190426

#제출 시각아이디문제언어결과실행 시간메모리
1190426DangKhoizzzzValley (BOI19_valley)Pypy 3
0 / 100
833 ms193180 KiB
import sys from math import log2 from collections import deque def main(): sys.setrecursionlimit(1 << 25) input = sys.stdin.read().split() ptr = 0 N, S, Q, E = map(int, input[ptr:ptr+4]) ptr +=4 adj = [[] for _ in range(N+1)] edges = [] edge_to_index = {} for i in range(1, N): A, B, W = map(int, input[ptr:ptr+3]) ptr +=3 adj[A].append((B, W, i)) adj[B].append((A, W, i)) edges.append((A, B, W)) edge_to_index[(A, B)] = i edge_to_index[(B, A)] = i shops = set() for _ in range(S): C = int(input[ptr]) ptr +=1 shops.add(C) queries = [] for _ in range(Q): I, R = map(int, input[ptr:ptr+2]) ptr +=2 queries.append((I, R)) LOG = int(log2(N)) + 1 parent = [[-1]*(N+1) for _ in range(LOG)] depth = [0]*(N+1) dist_from_root = [0]*(N+1) q = deque([E]) parent[0][E] = -1 while q: u = q.popleft() for v, w, _ in adj[u]: if parent[0][v] == -1 and v != parent[0][u]: parent[0][v] = u depth[v] = depth[u] + 1 dist_from_root[v] = dist_from_root[u] + w q.append(v) for k in range(1, LOG): for v in range(1, N+1): if parent[k-1][v] != -1: parent[k][v] = parent[k-1][parent[k-1][v]] def lca(u, v): if depth[u] < depth[v]: u, v = v, u for k in range(LOG-1, -1, -1): if depth[u] - (1<<k) >= depth[v]: u = parent[k][u] if u == v: return u for k in range(LOG-1, -1, -1): if parent[k][u] != -1 and parent[k][u] != parent[k][v]: u = parent[k][u] v = parent[k][v] return parent[0][u] def distance(u, v): ancestor = lca(u, v) return dist_from_root[u] + dist_from_root[v] - 2 * dist_from_root[ancestor] edge_child = {} edge_parent = {} for i in range(1, N): A, B, W = edges[i-1] if depth[A] > depth[B]: edge_child[i] = A edge_parent[i] = B else: edge_child[i] = B edge_parent[i] = A closest_shop = [None]*(N+1) closest_dist = [float('inf')]*(N+1) stack = [(E, False)] while stack: node, processed = stack.pop() if not processed: stack.append((node, True)) for neighbor, _, _ in reversed(adj[node]): if neighbor != parent[0][node]: stack.append((neighbor, False)) else: if node in shops: closest_shop[node] = node closest_dist[node] = 0 for neighbor, _, _ in adj[node]: if neighbor != parent[0][node]: if closest_dist[neighbor] + (distance(node, neighbor)) < closest_dist[node]: closest_dist[node] = closest_dist[neighbor] + distance(node, neighbor) closest_shop[node] = closest_shop[neighbor] # Now process queries for I, R in queries: A, B, W = edges[I-1] u, v = A, B if depth[u] > depth[v]: child = u else: child = v parent_edge = edge_parent[I] child_edge = edge_child[I] if lca(parent_edge, R) == parent_edge and lca(child_edge, R) == child_edge: if closest_shop[child_edge] is not None: print(closest_dist[child_edge] + distance(R, child_edge)) else: print("oo") else: print("escaped") if __name__ == "__main__": main()

컴파일 시 표준 출력 (stdout) 메시지

Compiling 'valley.py'...

=======
  adding: __main__.pyc (deflated 44%)

=======
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...