結果
| 問題 | No.2696 Sign Creation | 
| コンテスト | |
| ユーザー |  mymelochan | 
| 提出日時 | 2024-03-22 22:09:19 | 
| 言語 | PyPy3 (7.3.15) | 
| 結果 | 
                                WA
                                 
                             | 
| 実行時間 | - | 
| コード長 | 2,437 bytes | 
| コンパイル時間 | 399 ms | 
| コンパイル使用メモリ | 82,176 KB | 
| 実行使用メモリ | 92,832 KB | 
| 最終ジャッジ日時 | 2024-12-20 11:58:24 | 
| 合計ジャッジ時間 | 9,533 ms | 
| ジャッジサーバーID (参考情報) | judge1 / judge2 | 
(要ログイン)
| ファイルパターン | 結果 | 
|---|---|
| sample | AC * 3 | 
| other | AC * 21 WA * 17 | 
ソースコード
#############################################################
import sys
sys.setrecursionlimit(10**7)
from heapq import heappop,heappush
from collections import deque,defaultdict,Counter
from bisect import bisect_left, bisect_right
from itertools import product,combinations,permutations
ipt = sys.stdin.readline
def iin():
    return int(ipt())
def lmin():
    return list(map(int,ipt().split()))
class dsu:
    def __init__(self,n):
        self.N = n
        self.cnt=[1]*self.N
        self.root=list(range(self.N))
        self.components = self.N
    def unite(self,x,y):
        x=self.leader(x)
        y=self.leader(y)
        if x!=y:
            self.components -= 1
            if self.cnt[x]<self.cnt[y]:
                x,y=y,x
            self.cnt[x]+=self.cnt[y]
            self.root[y]=x
            return x
        return None
    def leader(self,x):
        if self.root[x]==x:
            return x
        self.root[x]=self.leader(self.root[x])
        return self.root[x]
MOD = 998244353
#############################################################
H,W,N,D = lmin()
A = [[-1]*W for _ in range(H)]
L = [lmin() for _ in range(N)]
for i,(x,y) in enumerate(L):
    x,y = x-1,y-1
    A[x][y] = i
uf = dsu(N)
for idx,(x,y) in enumerate(L):
    x,y = x-1,y-1
    for i in range(x-D,x+D+1):
        for j in range(y-D,y+D+1):
            if 0 <= i < H and 0 <= j < W:
                if A[i][j] != -1:
                    uf.unite(A[i][j],idx)
S = set()
T = set()
for i in range(N):
    l = uf.leader(i)
    if uf.cnt[l] == 1:
        T.add(l)
    else:
        S.add(l)
tmp = len(S)
#print(S,T)
ma = 0
mi = 1<<30
for x in range(H):
    for y in range(W):
        if A[x][y] != -1:
            continue
        
        ss = set()
        tt = set()
        for i in range(x-D,x+D+1):
            for j in range(y-D,y+D+1):
                if 0 <= i < H and 0 <= j < W:
                    if A[i][j] != -1:
                        l = uf.leader(A[i][j])
                        if l in S:
                            ss.add(l)
                        else:
                            tt.add(l)
        if not ss:
            if tt:
                ma = max(ma, tmp+1)
                mi = min(mi, tmp+1)
            else:
                ma = max(ma, tmp)
                mi = min(mi, tmp)
        else:
            ma = max(ma, tmp-len(ss)+1)
            mi = min(mi, tmp-len(ss)+1)
print(mi,ma)
            
            
            
        