제출 #75285

#제출 시각아이디문제언어결과실행 시간메모리
75285zubec수열 (APIO14_sequence)C++14
100 / 100
1882 ms93060 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
 
ll n, m, a[100100], pref[100100];
 
int pr[100100][210];
 
struct line{
    ll k, b;
    int pos;
    inline ll eval(ll x){
        return k*x+b;
    }
};
 
inline ll intersect(line l1, line l2){
    return (l1.b-l2.b)/(l2.k-l1.k);
}
 
inline bool to_erase(line l1, line l2, line l3){
    ll x = intersect(l1, l3);
    return l2.eval(x) <= l3.eval(x);
}
 
int sz1, sz2;
 
line vec[100100], vecCur[100100];
 
inline void insrt(line ln){
    if (sz1 && vec[sz1-1].k == ln.k){
        if (vec[sz1-1].b < ln.b)
            sz1--; else
            return;
    }
    while(sz1 > 2 && to_erase(vec[sz1-2], vec[sz1-1], ln))
        sz1--;
    vec[sz1] = ln;
    ++sz1;
}
 
void swp(){
    swap(vec, vecCur);
    swap(sz1, sz2);
    sz1 = 0;
}
 
int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
 
    cin >> n >> m;
    for (int i = 1; i <= n; i++){
        cin >> a[i];
        pref[i] = pref[i-1] + a[i];
    }
    for (int i = 1; i <= n; i++)
        insrt({pref[i], -(pref[i]*pref[i]), i});
    swp();
    ll ans = 0;
    for (int ii = 1; ii <= m; ii++){
        int pos = 0;
        for (int i = ii+1; i <= n; i++){
            while(pos+1 < sz2 && vecCur[pos+1].pos < i && vecCur[pos].eval(pref[i]) <= vecCur[pos+1].eval(pref[i]))
                ++pos;
            pr[i][ii] = vecCur[pos].pos;
            ans = vecCur[pos].eval(pref[i]);
            insrt({pref[i], ans-(pref[i]*pref[i]), i});
        }
        swp();
    }
    cout << ans << endl;
    vector <int> vecAns;
    int x = n, y = m;
    while(x != 0){
        x = pr[x][y];
        y--;
        vecAns.push_back(x);
    }
    vecAns.pop_back();
    for (int i = vecAns.size()-1; i >= 0; i--)
        cout << vecAns[i] << ' ';
 
}
 
/**
 
7 3
4 1 3 4 0 2 3
 
*/
#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...