結果
| 問題 |
No.416 旅行会社
|
| ユーザー |
neterukun
|
| 提出日時 | 2021-01-03 00:54:42 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,213 ms / 4,000 ms |
| コード長 | 1,747 bytes |
| コンパイル時間 | 490 ms |
| コンパイル使用メモリ | 82,312 KB |
| 実行使用メモリ | 149,208 KB |
| 最終ジャッジ日時 | 2024-12-14 21:02:11 |
| 合計ジャッジ時間 | 13,257 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 21 |
ソースコード
from bisect import bisect_left
class PertiallyPersistentUnionFind:
def __init__(self, n):
self.INF = 10 ** 9
self.parent = [-1] * n
self.time = [self.INF] * n
self.size = [[(-1, -1)] for i in range(n)]
def root(self, t, x):
while self.time[x] <= t:
x = self.parent[x]
return x
def merge(self, t, x, y):
x = self.root(t, x)
y = self.root(t, y)
if x == y:
return False
if self.parent[x] > self.parent[y]:
x, y = y, x
self.parent[x] += self.parent[y]
self.size[x].append((t, self.parent[x]))
self.parent[y] = x
self.time[y] = t
return True
def same(self, t, x, y):
return self.root(t, x) == self.root(t, y)
def size(self, t, x):
x = self.root(t, x)
idx = bisect_left(self.size[x], (t, self.INF)) - 1
return -self.size[x][idx][1]
n, m, q = map(int, input().split())
edges = [tuple(map(int, input().split())) for i in range(m)]
queries = [tuple(map(int, input().split())) for i in range(q)]
remain = set(edges)
for e in queries:
remain.remove(e)
uf = PertiallyPersistentUnionFind(n)
for a, b in remain:
a -= 1
b -= 1
uf.merge(0, a, b)
for t, (a, b) in enumerate(queries[::-1]):
a -= 1
b -= 1
t += 1
uf.merge(t, a, b)
ans = []
for v in range(1, n):
if not uf.same(q, 0, v):
ans.append(0)
continue
ok = q
ng = -1
while abs(ok - ng) > 1:
mid = (ok + ng) // 2
if uf.same(mid, 0, v):
ok = mid
else:
ng = mid
if ok == 0:
ans.append(-1)
else:
ans.append(q - ok + 1)
print('\n'.join(map(str, ans)))
neterukun