結果
問題 |
No.3200 Sinking Islands
|
ユーザー |
|
提出日時 | 2025-07-15 18:47:03 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,999 bytes |
コンパイル時間 | 514 ms |
コンパイル使用メモリ | 82,052 KB |
実行使用メモリ | 160,984 KB |
最終ジャッジ日時 | 2025-07-15 18:47:16 |
合計ジャッジ時間 | 12,545 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | WA * 2 |
other | WA * 20 |
ソースコード
from collections import Counter, deque, defaultdict from heapq import heapify, heappop, heappush, nlargest, nsmallest from bisect import bisect_left, bisect, bisect_right from string import ascii_lowercase, ascii_uppercase, digits from copy import deepcopy from time import perf_counter import sys from typing import Any, List, Callable def debug(*args, sep=" ", end="\n") -> None: print(*args, sep=sep, end=end, file=sys.stderr) def yn(b): print('Yes' if b else 'No') return b def gcd(a, b): a = abs(a); b = abs(b) if a < b: a, b = b, a while b > 0: a, b = b, a % b return a def lcm(a, b): return a * b // gcd(a, b) class UnionFind: def __init__(self, n) -> None: self.n = n self.parents = [-1 for _ in range(n)] def find(self, x): path = [] while self.parents[x] >= 0: path.append(x) x = self.parents[x] for y in path: self.parents[y] = x return x def union(self, x, y): x = self.find(x) y = self.find(y) if x == y: return False if self.parents[x] > self.parents[y]: x, y = y, x self.parents[x] += self.parents[y] self.parents[y] = x return True def size(self, x): return -self.parents[self.find(x)] def same(self, x, y): return self.find(x) == self.find(y) def members(self, x): root = self.find(x) return [i for i in range(self.n) if self.find(i) == root] def roots(self): return [i for i, x in enumerate(self.parents) if x < 0] def group_count(self): return len(self.roots()) def all_group_members(self): group_members = defaultdict(list) for member in range(self.n): group_members[self.find(member)].append(member) return group_members def __str__(self): return '\n'.join(f'{r}: {m}' for r, m in self.all_group_members().items()) def main(): global inf, MOD input = sys.stdin.read().split() ptr = 0 inf = float("inf") MOD = 998244353 N, M = map(int, input[ptr:ptr + 2]); ptr += 2 E = [] for _ in range(M): u, v = map(lambda x: int(x) - 1, input[ptr:ptr + 2]); ptr += 2 E.append((u, v)) Q = int(input[ptr]); ptr += 1 B = list(map(lambda x: int(x) - 1, input[ptr:ptr + Q])); ptr += Q usable = [True] * M for b in B: usable[b] = False U = UnionFind(N) for i in range(Q): if usable[i]: u, v = E[i] U.union(u, v) ans = [0] for r in U.roots(): s = U.size(r) ans[0] += s * (N - s) ans[0] //= 2 for i in range(Q - 1): b = B[-i - 1] u, v = E[b] if U.same(u, v): d = 0 else: s, t = U.size(u), U.size(v) d = s * t U.union(u, v) ans.append(ans[-1] - d) print(*ans[::-1]) if __name__ == "__main__": main()