結果
| 問題 |
No.772 Dynamic Distance Sum
|
| コンテスト | |
| ユーザー |
gew1fw
|
| 提出日時 | 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()
gew1fw