Submission #717629

#TimeUsernameProblemLanguageResultExecution timeMemory
717629Cookie수열 (APIO14_sequence)C++14
100 / 100
820 ms83336 KiB
#include<bits/stdc++.h>
#include<fstream>
using namespace std;
ifstream fin("FOOD.INP");
ofstream fout("FOOD.OUT");
#define ll long long
#define pb push_back
#define forr(i, a, b) for(int i = a; i < b; i++)
#define dorr(i, a, b) for(int i = a; i >= b; i--)
#define ld long double
#define vt vector
#include<fstream>
#define fi first
#define pf push_front
#define se second
#define pll pair<ll, ll>
#define pii pair<int, int>
const ld PI = 3.14159265359;
const ll mod = 1e9 + 7;
const int mxn = 5e3, mxm = 1e5;
const ll inf = 1e18;
struct Line{
    ll m, c;  int id; // use for tracing
    Line(){
        m = c = id = 0;
    }
    Line(ll _m, ll _c, int _id){
        m = _m; c = _c; id = _id;
    }
    ll val(ll x){return(x * m + c);}
    ld intersect(const Line &other){return((ld)(c - other.c) / (other.m - m));}
};
int n, k;
int trace[100001][201];
ll dp[100001][2], a[100005], p[100005];
signed main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    cin >> n >> k;
    forr(i, 1, n + 1)cin >> a[i];
    forr(i, 1, n + 1){
        p[i] = p[i - 1] + a[i];
    }
    memset(dp, -1, sizeof(dp));
    ll ans = -1, id = -1;
    dp[0][0] = 0;
    forr(j, 1, k + 1){
        deque<Line>dq;
        if(dp[0][0] != -1)dq.pb(Line(0, 0, 0));
        forr(i, 1, n + 1){
            while(dq.size() >= 2 && dq.back().val(p[i]) <= dq[dq.size() - 2].val(p[i]))dq.pop_back();
            dp[i][1] = dq.back().val(p[i]) - p[i] * p[i] + p[i] * p[n];
            trace[i][j] = dq.back().id;
            if(j == k){
                if(dp[i][1] > ans){
                    ans = dp[i][1]; id = i;
                }
            }
            if(dp[i][0] == -1)continue;
            Line curr = Line(p[i], -p[i] * p[n] + dp[i][0], i);
            while(dq.size() >= 2 && (curr.c - dq[0].c) * (dq[1].m - dq[0].m) <= (dq[0].m - curr.m) * (dq[0].c - dq[1].c)){
                dq.pop_front();
            }
            dq.pf(curr);
            
         }
        forr(i, 1, n + 1){
            dp[i][0] = dp[i][1];
        }
    }
    
    cout << ans << "\n";
    vt<int>cut;
    for(int i = k; i >= 1; i--){
        cut.pb(id);
        id = trace[id][i];
    }
    for(auto i: cut)cout << i << " ";
    return(0);
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...