結果

問題 No.2456 Stamp Art
ユーザー lam6er
提出日時 2025-03-20 20:44:57
言語 PyPy3
(7.3.15)
結果
MLE  
実行時間 -
コード長 2,400 bytes
コンパイル時間 178 ms
コンパイル使用メモリ 82,356 KB
実行使用メモリ 631,684 KB
最終ジャッジ日時 2025-03-20 20:45:07
合計ジャッジ時間 8,593 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 3
other AC * 3 MLE * 1 -- * 19
権限があれば一括ダウンロードができます

ソースコード

diff #

import sys

def main():
    H, W = map(int, sys.stdin.readline().split())
    grid = []
    black = []
    white = set()
    for i in range(H):
        S = sys.stdin.readline().strip()
        grid_row = []
        for j in range(W):
            if S[j] == '#':
                black.append((i+1, j+1))
            else:
                white.add((i+1, j+1))
        grid.append(S)

    # Precompute cumulative sum for white cells (1-based index)
    cum_white = [[0]*(W+2) for _ in range(H+2)]
    for i in range(1, H+1):
        for j in range(1, W+1):
            cum_white[i][j] = cum_white[i-1][j] + cum_white[i][j-1] - cum_white[i-1][j-1]
            if (i, j) in white:
                cum_white[i][j] += 1

    max_k = min(H, W)
    for k in range(max_k, 0, -1):
        a_max = H - k + 1
        b_max = W - k + 1
        if a_max < 1 or b_max < 1:
            continue

        # Collect allowed (a, b)
        allowed = []
        for a in range(1, a_max + 1):
            for b in range(1, b_max + 1):
                i2 = a + k - 1
                j2 = b + k - 1
                # Check if there are no white cells in the k x k square starting at (a, b)
                count = cum_white[i2][j2] - cum_white[a-1][j2] - cum_white[i2][b-1] + cum_white[a-1][b-1]
                if count == 0:
                    allowed.append((a, b))

        if not allowed:
            continue

        # Check all black cells are covered by at least one allowed (a, b)
        valid = True
        for (i, j) in black:
            a_start = max(1, i - k + 1)
            a_end = min(a_max, i)
            b_start = max(1, j - k + 1)
            b_end = min(b_max, j)

            found = False
            for a in range(a_start, a_end + 1):
                i1 = a
                i2 = a + k - 1
                if i1 > i or i2 < i:
                    continue
                for b in range(b_start, b_end + 1):
                    j1 = b
                    j2 = b + k - 1
                    if j1 > j or j2 < j:
                        continue
                    if (a, b) in allowed:
                        found = True
                        break
                if found:
                    break
            if not found:
                valid = False
                break

        if valid:
            print(k)
            return

    print(1)

if __name__ == "__main__":
    main()
0