結果
| 問題 |
No.1266 7 Colors
|
| コンテスト | |
| ユーザー |
👑 SPD_9X2
|
| 提出日時 | 2020-10-23 23:12:19 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 849 ms / 3,000 ms |
| コード長 | 1,915 bytes |
| コンパイル時間 | 390 ms |
| コンパイル使用メモリ | 82,356 KB |
| 実行使用メモリ | 161,176 KB |
| 最終ジャッジ日時 | 2024-07-21 12:36:13 |
| 合計ジャッジ時間 | 13,902 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 19 |
ソースコード
"""
https://yukicoder.me/problems/no/1266
頂点を7倍する
→行ける頂点数になる
N*C+v を頂点番号とする
"""
from sys import stdin
def uf_find(n):
ufl = []
while p[n] != n:
ufl.append(n)
n = p[n]
for i in ufl:
p[i] = n
return n
def uf_union(a,b):
ap = uf_find(a)
bp = uf_find(b)
if ap == bp:
return True
else:
if rank[ap] > rank[bp]:
p[bp] = ap
vnum[ap] += vnum[bp]
elif rank[ap] < rank[bp]:
p[ap] = bp
vnum[bp] += vnum[ap]
else:
p[bp] = ap
rank[ap] += 1
vnum[ap] += vnum[bp]
return False
N,M,Q = map(int,stdin.readline().split())
exist = [False] * (7*N)
p = [i for i in range(7*N)]
rank = [0] * (7*N)
vnum = [1] * (7*N)
slis = []
for i in range(N):
s = list(stdin.readline()[:-1])
for j in range(7):
if s[j] == "1":
exist[N*j+i] = True
if s[j] == "1" and s[(j+1)%7] == "1":
k = (j+1)%7
uf_union(N*j+i , N*k+i)
slis.append(s)
lis = [ [] for i in range(N) ]
for i in range(M):
v,u = map(int,stdin.readline().split())
v -= 1
u -= 1
for j in range(7):
if exist[N*j+v] and exist[N*j+u]:
uf_union(N*j+v,N*j+u)
lis[v].append(u)
lis[u].append(v)
ans = []
for loop in range(Q):
tp,x,y = map(int,stdin.readline().split())
x -= 1
y -= 1
if tp == 1:
exist[N*y+x] = True
for nex in lis[x]:
if exist[N*y+nex]:
uf_union(N*y+x,N*y+nex)
if slis[x][(y-1)%7] == "1":
k = (y-1)%7
uf_union(N*y+x,N*k+x)
if slis[x][(y+1)%7] == "1":
k = (y+1)%7
uf_union(N*y+x,N*k+x)
slis[x][y] = "1"
else:
ans.append( vnum[uf_find(x)] )
print ("\n".join(map(str,ans)))
SPD_9X2