""" [誤答] 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] のようにすると # 打ち切り系の解法をまとめて落とせる。 # ============================================================