結果
問題 |
No.2456 Stamp Art
|
ユーザー |
![]() |
提出日時 | 2025-06-12 15:19:37 |
言語 | PyPy3 (7.3.15) |
結果 |
AC
|
実行時間 | 3,510 ms / 5,000 ms |
コード長 | 2,286 bytes |
コンパイル時間 | 223 ms |
コンパイル使用メモリ | 82,356 KB |
実行使用メモリ | 308,900 KB |
最終ジャッジ日時 | 2025-06-12 15:20:24 |
合計ジャッジ時間 | 45,051 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 23 |
ソースコード
def main(): import sys input = sys.stdin.read data = input().split() idx = 0 H = int(data[idx]) idx += 1 W = int(data[idx]) idx += 1 S = [] for _ in range(H): S.append(data[idx]) idx += 1 # Compute prefix sum of the grid sum_grid = [[0]*(W+2) for _ in range(H+2)] for i in range(1, H+1): for j in range(1, W+1): sum_grid[i][j] = sum_grid[i-1][j] + sum_grid[i][j-1] - sum_grid[i-1][j-1] if S[i-1][j-1] == '#': sum_grid[i][j] += 1 def check(k): if k == 0 or k > H or k > W: return False # Compute valid grid valid = [[0]*(W+2) for _ in range(H+2)] for i in range(1, H+1): for j in range(1, W+1): if i + k - 1 > H or j + k - 1 > W: continue a = i b = i + k - 1 c = j d = j + k - 1 total = sum_grid[b][d] - sum_grid[a-1][d] - sum_grid[b][c-1] + sum_grid[a-1][c-1] if total == k * k: valid[i][j] = 1 # Compute prefix sum of valid pre_valid = [[0]*(W+2) for _ in range(H+2)] for i in range(1, H+1): row_sum = 0 for j in range(1, W+1): row_sum += valid[i][j] pre_valid[i][j] = pre_valid[i-1][j] + row_sum # Check each black cell for x in range(1, H+1): for y in range(1, W+1): if S[x-1][y-1] == '#': a = max(1, x - k + 1) b = x c = max(1, y - k + 1) d = y if a > H or c > W or b < a or d < c: return False sum_rect = pre_valid[b][d] - pre_valid[a-1][d] - pre_valid[b][c-1] + pre_valid[a-1][c-1] if sum_rect == 0: return False return True low = 1 high = min(H, W) ans = 0 while low <= high: mid = (low + high) // 2 if check(mid): ans = mid low = mid + 1 else: high = mid - 1 print(ans) if __name__ == "__main__": main()