結果
問題 | No.772 Dynamic Distance Sum |
ユーザー |
![]() |
提出日時 | 2025-06-12 20:38:45 |
言語 | PyPy3 (7.3.15) |
結果 |
TLE
|
実行時間 | - |
コード長 | 2,930 bytes |
コンパイル時間 | 363 ms |
コンパイル使用メモリ | 81,920 KB |
実行使用メモリ | 86,528 KB |
最終ジャッジ日時 | 2025-06-12 20:38:56 |
合計ジャッジ時間 | 10,343 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 1 TLE * 1 -- * 25 |
ソースコード
import sys from collections import defaultdict sys.setrecursionlimit(1 << 25) def main(): input = sys.stdin.read data = input().split() ptr = 0 N, Q = int(data[ptr]), int(data[ptr+1]) ptr += 2 queries = [] S = 0 sum_S = 0 for _ in range(Q): t = int(data[ptr]) if t == 1: a = int(data[ptr+1]) b = int(data[ptr+2]) c = int(data[ptr+3]) queries.append((1, a, b, c)) ptr +=4 elif t == 2: a = int(data[ptr+1]) b = int(data[ptr+2]) queries.append((2, a, b)) ptr +=3 else: a = int(data[ptr+1]) queries.append((3, a)) ptr +=2 X = [1]*(N+1) edges = defaultdict(set) edge_info = dict() for q in queries: if q[0] == 1: a = (q[1] -1 + S) % N +1 b = (q[2] -1 + S) % N +1 c = q[3] edges[a].add(b) edges[b].add(a) edge_info[(a, b)] = c edge_info[(b, a)] = c elif q[0] == 2: a = (q[1]-1 + S) % N +1 b = (q[2]-1 + S) % N +1 if a in edges and b in edges[a]: edges[a].remove(b) edges[b].remove(a) del edge_info[(a, b)] del edge_info[(b, a)] elif q[0] == 3: a = (q[1]-1 + S) % N +1 X[a] = 1 - X[a] tree_nodes = set() visited = set() stack = [a] visited.add(a) tree_nodes.add(a) while stack: u = stack.pop() for v in edges[u]: if v not in visited: visited.add(v) tree_nodes.add(v) stack.append(v) total = 0 min_sum = float('inf') for u in tree_nodes: s = 0 for v in tree_nodes: if u == v: continue path = [] visited_p = set() stack_p = [(u, 0)] found = False while stack_p: node, dist = stack_p.pop() if node == v: s += dist * X[v] found = True break visited_p.add(node) for neighbor in edges[node]: if neighbor not in visited_p: stack_p.append((neighbor, dist + edge_info[(node, neighbor)])) if not found: pass if s < min_sum: min_sum = s S += min_sum sum_S += min_sum print(min_sum) if __name__ == '__main__': main()