結果

問題 No.2456 Stamp Art
ユーザー 👑 rin204
提出日時 2023-09-01 22:08:21
言語 PyPy3
(7.3.15)
結果
AC  
実行時間 2,277 ms / 5,000 ms
コード長 1,113 bytes
コンパイル時間 431 ms
コンパイル使用メモリ 82,304 KB
実行使用メモリ 324,608 KB
最終ジャッジ日時 2024-06-11 17:58:00
合計ジャッジ時間 25,676 ms
ジャッジサーバーID
(参考情報)
judge1 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 23
権限があれば一括ダウンロードができます

ソースコード

diff #

h, w = map(int, input().split())
S = [input() for _ in range(h)]
cum = [[0] * (w + 1) for _ in range(h + 1)]
for i in range(h):
    for j in range(w):
        if S[i][j] == "#":
            cum[i + 1][j + 1] = 1
        cum[i + 1][j + 1] += cum[i + 1][j] + cum[i][j + 1] - cum[i][j]


def ok(x):
    dp = [[0] * (w + 1) for _ in range(h + 1)]
    for i in range(h - x + 1):
        for j in range(w - x + 1):
            c = cum[i + x][j + x] - cum[i + x][j] - cum[i][j + x] + cum[i][j]
            if c == x * x:
                dp[i][j] += 1
                dp[i + x][j] -= 1
                dp[i][j + x] -= 1
                dp[i + x][j + x] += 1

    for i in range(h):
        for j in range(w - 1):
            dp[i][j + 1] += dp[i][j]

    for i in range(h - 1):
        for j in range(w):
            dp[i + 1][j] += dp[i][j]

    for i in range(h):
        for j in range(w):
            if dp[i][j] == 0 and S[i][j] == "#":
                return False
    return True


l = 1
r = min(h, w) + 1
while r - l > 1:
    mid = (l + r) // 2
    if ok(mid):
        l = mid
    else:
        r = mid

print(l)
0