結果
問題 | No.1266 7 Colors |
ユーザー |
|
提出日時 | 2020-10-23 23:59:43 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,081 ms / 3,000 ms |
コード長 | 2,335 bytes |
コンパイル時間 | 519 ms |
コンパイル使用メモリ | 82,164 KB |
実行使用メモリ | 135,964 KB |
最終ジャッジ日時 | 2024-07-21 14:00:33 |
合計ジャッジ時間 | 15,622 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
class UnionFind():def __init__(self, n):self.n = nself.parents = [-1] * ndef find(self, x):if self.parents[x] < 0:return xelse:self.parents[x] = self.find(self.parents[x])return self.parents[x]def union(self, x, y):x = self.find(x)y = self.find(y)if x == y:returnif self.parents[x] > self.parents[y]:x, y = y, xself.parents[x] += self.parents[y]self.parents[y] = xdef same(self, x, y):return self.find(x) == self.find(y)def roots(self):return [i for i, x in enumerate(self.parents) if x < 0]def num_roots(self):return len([i for i, x in enumerate(self.parents) if x < 0])def members(self, x):root = self.find(x)return [i for i in range(self.n) if self.find(i) == root]def num_members(self,x):return abs(self.parents[self.find(x)])def __str__(self):return '\n'.join('{}: {}'.format(r, self.members(r)) for r in self.roots())import sys,os,ioinput = sys.stdin.readlineN, M, Q = map(int, input().split())uf = UnionFind(N*7)S = [list(input()) for _ in range(N)]for i in range(N):for j in range(7):if S[i][j] == '1' and S[i][(j + 1) % 7] == '1':uf.union(i * 7 + j, i * 7 + (j + 1) % 7)# print(i * 7 + j, i * 7 + (j + 1) % 7)edge = [[] for _ in range(N)]for i in range(M):x, y = map(int, input().split())x -= 1; y -= 1;edge[x].append(y)edge[y].append(x)for j in range(7):if S[x][j] == '1' and S[y][j] == '1':uf.union(x * 7 + j, y * 7 + j);# print(x * 7 + j, y * 7 + j)for i in range(Q):t, a, b = map(int, input().split())a -= 1; b -= 1;if t == 1:S[a][b] = '1'if S[a][(b - 1) % 7] == '1':uf.union(a * 7 + (b - 1) % 7, a * 7 + b)# print(a * 7 + (b - 1) % 7, a * 7 + b)if S[a][(b + 1) % 7] == '1':uf.union(a * 7 + (b + 1) % 7, a * 7 + b)# print(a * 7 + (b + 1) % 7, a * 7 + b)for v in edge[a]:if S[v][b] == '1':uf.union(a * 7 + b, v * 7 + b)# print(a * 7 + b, v * 7 + b)else:print(uf.num_members(a * 7))# 0 1# 9 10# 21 22# 25 26# 26 27# 27 21# 31 32# 32 33# 39 40# 42 43# 14 21# 7 35# 9 37# 7 28# 10 31# 14 35# 14 42# 0 14# 21 28# 25 32# 26 33# 19# 17 18# 19# 19# 25 24# 24 17# 24 31# 22 23# 24 23# 23