結果
| 問題 |
No.2696 Sign Creation
|
| コンテスト | |
| ユーザー |
timi
|
| 提出日時 | 2024-02-03 04:15:32 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 338 ms / 2,500 ms |
| コード長 | 1,501 bytes |
| コンパイル時間 | 175 ms |
| コンパイル使用メモリ | 82,972 KB |
| 実行使用メモリ | 83,272 KB |
| 最終ジャッジ日時 | 2024-12-20 11:47:59 |
| 合計ジャッジ時間 | 7,501 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 38 |
ソースコード
H,W,N,D=map(int, input().split())
A=[[-1]*W for _ in range(H)]
for i in range(N):
h,w=map(int, input().split())
h-=1;w-=1
A[h][w]=i
B=[]
for i in range(-D,D+1):
for j in range(-D,D+1):
if abs(i)+abs(j)<=D:
B.append((i,j))
par=[i for i in range(N)];rank=[0]*N;size=[1]*N
def find(x):
if par[x]==x:
return x
else:
par[x]=find(par[x])
return par[x]
#同じ集合か判定
def same(x,y):
return find(x)==find(y)
def union(x,y):
x=find(x)
y=find(y)
if x==y:
return
if rank[x]>rank[y]:
par[y]=x
size[x]+=size[y]
else:
par[x]=y
size[y]+=size[x]
if rank[x]==rank[y]:
rank[y]+=1
for h in range(H):
for w in range(W):
if A[h][w]==-1:
continue
p=A[h][w]
for x,y in B:
nh,nw=h+x,w+y
if 0<=nh<H and 0<=nw<W and A[nh][nw]!=-1:
q=A[nh][nw]
union(p,q)
D={};E={};F={}
for i in range(N):
d=find(i)
if d not in F:
F[d]=1
if size[d]==1:
D[d]=1
else:
E[d]=1
al=len(E);ans=[]
for h in range(H):
for w in range(W):
if A[h][w]!=-1:
continue
DD,EE=set(),set()
for x,y in B:
nh,nw=h+x,w+y
if 0<=nh<H and 0<=nw<W and A[nh][nw]!=-1:
q=find(A[nh][nw])
if size[q]==1:
EE.add(q)
else:
DD.add(q)
if len(EE)==0:
if len(DD)==0:
ans.append(al)
else:
ans.append(al-len(DD)+1)
else:
ans.append(al-len(DD)+1)
print(min(ans),max(ans))
timi