187492025-11-04 11:11:56nlaciCsoportokba osztáscpp17Elfogadva 100/1001.554s4340 KiB
#include <bits/stdc++.h>

using namespace std;

struct line{
    long long a;
    mutable long long b;
    mutable double l;
    bool p;
    line(double l) : l(l), p(true) {}
    line(long long a, long long b) : a(a), b(b), l(-1e18), p(false) {}
    long long eval(long long x) const {
        return a*x + b;
    }
    double intersection(set<line>::iterator l) const{
        if(a == l->a) return 0;
        return (double)(l->b - b)/(double)(a - l->a);
    }
    bool operator<(const line &l) const{
        if(!p && !l.p) return a < l.a;
        return this->l < l.l;
    }
};

struct CHT{
    set<line> s;
    inline bool check(set<line>::iterator l, set<line>::iterator m, set<line>::iterator r) const{
        return l->intersection(r) <= l->intersection(m);
    }
    void insert(line l){
        auto it = s.insert(l).first;
        if(it->b > l.b)
            return;
        it->b = l.b;
        if(it != s.begin() && next(it) != s.end() && check(prev(it), it, next(it))){
            s.erase(it);
            return;
        }
        while(it != s.begin() && prev(it) != s.begin() && check(prev(it, 2), prev(it), it))
            s.erase(prev(it));
        while(next(it) != s.end() && next(it, 2) != s.end() && check(it, next(it), next(it, 2)))
            s.erase(next(it));
        if(it != s.begin()) it->l = it->intersection(prev(it));
        if(next(it) != s.end()) next(it)->l = it->intersection(next(it));
    }
    long long get_max(long long x){
        if(s.empty()) return 0;
        return prev(s.lower_bound(line((double)x)))->eval(x);
    }   
};

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

    int n, k;
    cin>>n>>k;

    vector<long long> v(n), ossz(n);
    for(long long &x : v)
        cin>>x;

    ossz[0] = v[0];
    for(int i = 1; i < n; i++)
        ossz[i] = ossz[i-1] + v[i];

    vector<long long> dp(n);
    for(int i = 0; i < n; i++)
        dp[i] = ossz[i]*abs(v[i]);
    
    for(int i = 1; i < k; i++){
        CHT cht;
        vector<long long> dp1(n);
        for(int j = i; j < n; j++){
            cht.insert(line(-ossz[j-1], dp[j-1]));
            dp1[j] = cht.get_max(abs(v[j])) + ossz[j]*abs(v[j]);
        }
        swap(dp, dp1);
    }

    cout<<dp[n-1]<<'\n';

    return 0;
}
RészfeladatÖsszpontTesztVerdiktIdőMemória
subtask10/0
1Elfogadva1ms316 KiB
2Elfogadva1ms500 KiB
subtask25/5
3Elfogadva16ms3400 KiB
4Elfogadva16ms3396 KiB
5Elfogadva28ms4036 KiB
subtask322/22
6Elfogadva13ms316 KiB
7Elfogadva12ms316 KiB
8Elfogadva13ms316 KiB
9Elfogadva16ms468 KiB
10Elfogadva16ms496 KiB
11Elfogadva17ms656 KiB
subtask434/34
12Elfogadva2ms316 KiB
13Elfogadva1ms500 KiB
14Elfogadva2ms316 KiB
15Elfogadva867ms4148 KiB
16Elfogadva867ms4252 KiB
17Elfogadva867ms4148 KiB
18Elfogadva2ms316 KiB
19Elfogadva2ms316 KiB
20Elfogadva2ms316 KiB
21Elfogadva810ms4200 KiB
22Elfogadva810ms4164 KiB
23Elfogadva808ms4148 KiB
subtask529/29
24Elfogadva1.526s4340 KiB
25Elfogadva1.549s4148 KiB
26Elfogadva1.503s4148 KiB
27Elfogadva1.508s4148 KiB
28Elfogadva1.547s4340 KiB
29Elfogadva1.554s4148 KiB
30Elfogadva1.47s4148 KiB
31Elfogadva1.47s4256 KiB
32Elfogadva1.475s4160 KiB
subtask610/10
33Elfogadva1.006s4276 KiB
34Elfogadva1.031s4292 KiB
35Elfogadva986ms4148 KiB
36Elfogadva996ms4152 KiB
37Elfogadva1.008s4168 KiB
38Elfogadva1s4292 KiB