結果
| 問題 | No.3656 Game Scores and Costs |
| コンテスト | |
| ユーザー |
sepa38
|
| 提出日時 | 2026-08-27 13:21:37 |
| 言語 | PyPy3 (7.3.23) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,703 bytes |
| 記録 | |
| コンパイル時間 | 235 ms |
| コンパイル使用メモリ | 96,104 KB |
| 実行使用メモリ | 130,944 KB |
| 最終ジャッジ日時 | 2026-08-30 13:04:00 |
| 合計ジャッジ時間 | 3,903 ms |
|
ジャッジサーバーID (参考情報) |
judge2_0 / judge1_0 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 13 WA * 8 |
ソースコード
"""
[誤答] f(i) が f(i-1) より下がった時点で打ち切る解法
「f は上がってから下がる(単峰)」という思い込みによる打ち切り。
実際には S(i) の増分(= 上位 K 個の総和の伸び)は単調ではないため、
一度下がった後に大きな A_i が来て再び伸びることがある。
"""
import heapq
import sys
def main():
data = sys.stdin.buffer.read().split()
n, k, x = int(data[0]), int(data[1]), int(data[2])
a = list(map(int, data[3:3 + n]))
heap = []
s = 0
ans = -(1 << 62)
prev = None
for i in range(1, n + 1):
v = a[i - 1]
if len(heap) < k:
heapq.heappush(heap, v)
s += v
elif v > heap[0]:
s += v - heapq.heapreplace(heap, v)
cur = s - x * i
if prev is not None and cur < prev: # BUG: 局所的な減少で打ち切っている
break
ans = max(ans, cur)
prev = cur
print(ans)
main()
# ============================================================
# Hack ケース
# ------------------------------------------------------------
# サンプル: 3問すべて通過する(危険)
#
# 入力:
# 3 2 2
# 10 1 100
#
# 想定解の出力: 104 (f(1)=8, f(2)=7, f(3)=110-6=104)
# この解法の出力: 8
#
# 理由: i=2 でいったん下がるが i=3 で大きく回復する。
# 「小さい値を挟んでから大きい値」を置くのが基本パターン。
# N を大きくして [10^9, 0, 0, ..., 0, 10^9] のようにすると
# 打ち切り系の解法をまとめて落とせる。
# ============================================================
sepa38