結果
問題 | No.1266 7 Colors |
ユーザー |
![]() |
提出日時 | 2020-10-23 23:23:42 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 1,449 ms / 3,000 ms |
コード長 | 1,841 bytes |
コンパイル時間 | 303 ms |
コンパイル使用メモリ | 82,304 KB |
実行使用メモリ | 121,476 KB |
最終ジャッジ日時 | 2024-07-21 13:20:05 |
合計ジャッジ時間 | 20,347 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 19 |
ソースコード
class UnionFind:def __init__(self, n):self.par = [i for i in range(n+1)]self.rank = [0] * (n + 1)self.size = [1] * (n + 1)# 検索def find(self, x):if self.par[x] == x:return xelse:self.par[x] = self.find(self.par[x])return self.par[x]# 併合def unite(self, x, y):x = self.find(x)y = self.find(y)if x == y:returnif self.rank[x] < self.rank[y]:self.par[x] = yself.size[y] += self.size[x]else:self.par[y] = xself.size[x] += self.size[y]if self.rank[x] == self.rank[y]:self.rank[x] += 1# 同じ集合に属するか判定def same_check(self, x, y):return self.find(x) == self.find(y)n, m, q = map(int, input().split())s = [list(map(int, input())) for _ in range(n)]uf = UnionFind(n * 7)g = [[] for _ in range(n)]for i in range(m):u, v = map(int, input().split())g[u - 1].append(v - 1)g[v - 1].append(u - 1)for i in range(n * 7):v, c = i // 7, i % 7if s[v][c]:if s[v][(c + 1) % 7]:uf.unite(i, v * 7 + (c + 1) % 7)if s[v][(c - 1) % 7]:uf.unite(i, v * 7 + (c - 1) % 7)for node in g[v]:if s[node][c]:uf.unite(i, node * 7 + c)for _ in range(q):t, x, y = map(int, input().split())x -= 1y -= 1if t == 1:s[x][y] = 1for node in g[x]:if s[node][y]:uf.unite(x * 7 + y, node * 7 + y)if s[x][(y + 1) % 7]:uf.unite(x * 7 + y, x * 7 + (y + 1) % 7)if s[x][(y - 1) % 7]:uf.unite(x * 7 + y, x * 7 + (y - 1) % 7)else:print(uf.size[uf.find(x * 7)])