結果
| 問題 | No.2139 K Consecutive Sushi |
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2025-06-25 15:47:43 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 173 ms / 2,000 ms |
| コード長 | 893 bytes |
| 記録 | |
| コンパイル時間 | 481 ms |
| コンパイル使用メモリ | 82,596 KB |
| 実行使用メモリ | 108,292 KB |
| 最終ジャッジ日時 | 2025-06-25 15:47:49 |
| 合計ジャッジ時間 | 4,661 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 31 |
ソースコード
import sys
from collections import deque
MI=lambda:map(int,sys.stdin.readline().split())
n,K=MI()
A=list(MI())
# 窗口数
M=n-K+1
# dp[i] = 覆盖前 i 个窗口(0..i-1)的最小跳过代价
dp=[0]*(M+1)
# B[j] = 在位置 j 跳过的总代价候选 = dp[ max(0, j-K+1) ] + A[j]
B=[0]*n
dq=deque()
# 初始化窗0 时的候选 j∈[0..K-1]
for j in range(K):
B[j]=A[j]
while dq and B[dq[-1]]>=B[j]:
dq.pop()
dq.append(j)
# 依次算 dp[1]..dp[M]
for w in range(M):
# 用当前窗口 [w..w+K-1] 内最小的 B 作为 dp[w+1]
dp[w+1]=B[dq[0]]
# 滑出左端点 j=w
if dq[0]==w:
dq.popleft()
# 加入新点 j=w+K
nj=w+K
if nj<n:
idx=nj-K+1
if idx<0: idx=0
B[nj]=dp[idx]+A[nj]
while dq and B[dq[-1]]>=B[nj]:
dq.pop()
dq.append(nj)
# 总美味 - 最小跳过代价
print(sum(A)-dp[M])