結果
| 問題 |
No.2157 崖
|
| コンテスト | |
| ユーザー |
lam6er
|
| 提出日時 | 2025-03-31 17:43:18 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 1,469 ms / 6,000 ms |
| コード長 | 2,157 bytes |
| コンパイル時間 | 186 ms |
| コンパイル使用メモリ | 82,744 KB |
| 実行使用メモリ | 251,488 KB |
| 最終ジャッジ日時 | 2025-03-31 17:44:10 |
| 合計ジャッジ時間 | 15,313 ms |
|
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 22 |
ソースコード
import bisect
def main():
import sys
input = sys.stdin.read().split()
idx = 0
N, M = int(input[idx]), int(input[idx+1])
idx +=2
D = []
for _ in range(N):
row = list(map(int, input[idx:idx+M]))
idx += M
D.append(row)
# Initialize DP for the first row
current = sorted(D[0])
unique_current = []
prev_x = None
for x in current:
if x != prev_x:
unique_current.append(x)
prev_x = x
dp_prev = {x: 0 for x in unique_current}
if not dp_prev:
print(-1)
return
k = 5 # Number of neighboring elements to check
for i in range(1, N):
current_row = D[i]
current_row_sorted = sorted(current_row)
# Create unique x candidates in sorted order
unique_x = []
prev_x = None
for x in current_row_sorted:
if x != prev_x:
unique_x.append(x)
prev_x = x
dp_current = {}
prev_ys = sorted(dp_prev.keys())
if not prev_ys:
print(-1)
return
for x in sorted(unique_x):
j = bisect.bisect_right(prev_ys, x) - 1
if j < 0:
continue # no valid y
start = max(0, j - k)
end = min(len(prev_ys)-1, j + k)
min_max = float('inf')
for yj in range(start, end + 1):
y = prev_ys[yj]
if y > x:
continue
current_max = max(dp_prev[y], x - y)
if current_max < min_max:
min_max = current_max
if min_max != float('inf'):
if x in dp_current:
if min_max < dp_current[x]:
dp_current[x] = min_max
else:
dp_current[x] = min_max
dp_prev = dp_current
if not dp_prev:
print(-1)
return
if dp_prev:
print(min(dp_prev.values()))
else:
print(-1)
if __name__ == '__main__':
main()
lam6er