結果
問題 | No.2657 Falling Block Game |
ユーザー |
👑 |
提出日時 | 2024-03-03 16:36:12 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,494 bytes |
コンパイル時間 | 379 ms |
コンパイル使用メモリ | 82,240 KB |
実行使用メモリ | 189,336 KB |
最終ジャッジ日時 | 2024-09-29 16:54:22 |
合計ジャッジ時間 | 14,599 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 17 WA * 20 |
ソースコード
import heapqclass DeletableHeapq:def __init__(self, lst=None, reverse=False):if reverse:self.pm = -1else:self.pm = 1if lst is None:self.hq = []else:self.hq = [self.pm * x for x in lst]heapq.heapify(self.hq)self.tot = sum(self.hq) * self.pmself.cnt = {}for x in self.hq:self.cnt[x] = self.cnt.get(x, 0) + 1self.length = len(self.hq)def __bool__(self):return bool(self.hq)def __len__(self):return self.length@propertydef sum(self):return self.totdef top(self):if self.hq:return self.hq[0] * self.pmelse:return Nonedef __getitem__(self, i):# 先頭要素にアクセスしたいときのみassert i == 0return self.top()def push(self, x):self.length += 1self.cnt[x * self.pm] = self.cnt.get(x * self.pm, 0) + 1self.tot += xheapq.heappush(self.hq, x * self.pm)def pop(self):if not self.hq:return Noneself.length -= 1x = heapq.heappop(self.hq)self.cnt[x] -= 1self.tot -= x * self.pmself._delete()return x * self.pmdef remove(self, x):if self.cnt.get(x * self.pm, 0) == 0:return Falseself.length -= 1self.cnt[x * self.pm] -= 1self.tot -= xself._delete()return Truedef _delete(self):while self.hq and self.cnt.get(self.hq[0], 0) == 0:heapq.heappop(self.hq)h, w = map(int, input().split())S = [input() for _ in range(h)]dp = [0] * wfor i in range(h - 1, -1, -1):add = [[] for _ in range(w)]rem = [[] for _ in range(w)]for j in range(w):if S[i][j] == "#":continuel = max(0, j - dp[j])r = min(w - 1, j + dp[j])add[l].append(dp[j])rem[r].append(dp[j])hq = DeletableHeapq()hq.push(1 << 30)dp = [1 << 30] * wfor j in range(w):for a in add[j]:hq.push(a)dp[j] = hq[0]for a in rem[j]:hq.remove(a)for j in range(1, w):dp[j] = min(dp[j], dp[j - 1] + 1)for j in range(w - 2, -1, -1):dp[j] = min(dp[j], dp[j + 1] + 1)for j in range(w):if S[i][j] == "#":dp[j] = 1 << 30print(*dp, sep="\n")