結果

問題 No.3050 Prefix Removal
ユーザー srjywrdnprkt
提出日時 2025-03-12 11:37:46
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 129 ms / 2,000 ms
コード長 1,056 bytes
コンパイル時間 2,237 ms
コンパイル使用メモリ 198,500 KB
実行使用メモリ 12,852 KB
最終ジャッジ日時 2025-03-12 11:37:58
合計ジャッジ時間 11,852 ms
ジャッジサーバーID
(参考情報)
judge2 / judge3
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 55
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>
//#include <atcoder/modint>

using namespace std;
//using namespace atcoder;
using ll = long long;
//using mint = modint998244353;

int main(){
    cin.tie(nullptr);
    ios_base::sync_with_stdio(false);

    /*
       i回目にp_iまで取り除かれるとする。
       Aの累積和Sを取る。
       (S_{p_1}-S_0) * 1 + (S_{p_2}-S_{p_1}) * 2 + ..
       S_{p_K} * K - (S_{p_{K-1}} + ... + S_{p_1})

       p_K = iと選んだ時、j=1,2..., i-1からK-1個を総和が最小となるように選ぶ・(i>=K)
    */

    ll N, K, A, sm=0, mx;
    cin >> N >> K;
    priority_queue<ll> que;
    vector<ll> S(N+1);
    for (int i=1; i<=N; i++){
        cin >> A;
        S[i] = S[i-1] + A;
    }
    for (int i=1; i<=K-1; i++){
        que.push(S[i]);
        sm += S[i];
    }
    mx = K * S[K] - sm;

    for (int i=K+1; i<=N; i++){
        que.push(S[i-1]);
        sm += S[i-1];
        A = que.top();
        sm -= A;
        que.pop();
        mx = max(mx, K*S[i]-sm);
    }

    cout << mx << endl;

    return 0;
} 
0