結果
問題 | No.1390 Get together |
ユーザー |
![]() |
提出日時 | 2020-09-03 00:48:29 |
言語 | PyPy3 (7.3.15) |
結果 |
RE
(最新)
AC
(最初)
|
実行時間 | - |
コード長 | 1,256 bytes |
コンパイル時間 | 231 ms |
コンパイル使用メモリ | 82,060 KB |
実行使用メモリ | 67,532 KB |
最終ジャッジ日時 | 2024-11-30 10:33:53 |
合計ジャッジ時間 | 3,553 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | RE * 3 |
other | RE * 29 |
ソースコード
class UnionFind:def __init__(self, size):self.data = [-1] * sizedef root(self, x):if self.data[x] < 0:return xans = self.root(self.data[x])self.data[x] = ansreturn ansdef unite(self, x, y):x = self.root(x)y = self.root(y)if x == y:return Falseif self.data[x] > self.data[y]:x, y = y, xself.data[x] += self.data[y]self.data[y] = xreturn Truedef is_root(self, x):return self.data[x] < 0def size(self, x):return -self.data[self.root(x)]n, m = map(int, input().split(' '))assert 1 <= n <= 200000assert 1 <= m <= 200000b = [*map(int, input().split(' '))]assert len(b) == nfor i in b:assert 1 <= i <= mc = [*map(int, input().split(' '))]assert len(c) == nfor i in c:assert 1 <= i <= nfor i in range(n):b[i] -= 1c[i] -= 1uf = UnionFind(n + m) # n + i に色 i の超頂点をおくfor i in range(n):uf.unite(b[i], m + c[i])ans = 0for i in range(n + m):if uf.is_root(i):ans += uf.size(i) - 1for i in range(m, m + n): # 超頂点の分足しすぎるので、引くif uf.size(i) > 1:ans -= 1print(ans)