5559 2023. 07. 26 14:18:14 szil Majomház cpp17 Elfogadva 100/100 1.889s 23600 KiB
#include <bits/stdc++.h>

using ll = long long;
using namespace std;

const int MAXN = 200002;
const ll INF = 1e18;

int n, k;
ll a[MAXN], pref[MAXN], dp[MAXN], used[MAXN];

struct Point {
    ll a = -1;

    Point() {}

    Point(int x) {
        a = x;
    }

    ll f(ll b) {
        if (a == -1) return INF;
        return (pref[b] - pref[a]) * (b - a) + dp[a];
    }

    bool operator<(const Point &x) const {
        return true;
    }
};

Point tree[4*MAXN];

void add(Point p, int v = 1, int tl = 0, int tr = n+1) {
    int tm = (tl + tr) / 2;
    bool lef = p.f(tl) < tree[v].f(tl);
    bool mid = p.f(tm) < tree[v].f(tm);
    if (mid) swap(p, tree[v]);

    if (tl + 1 != tr) {
        if (lef != mid) {
            add(p, v*2, tl, tm);
        } else {
            add(p, v*2+1, tm, tr);
        }
    }
}

pair<ll, Point> get(int b, int v = 1, int tl = 0, int tr = n+1) {
    int tm = (tl + tr) / 2;
    pair<ll, Point> x = {tree[v].f(b), tree[v]};
    if (tl + 1 == tr) {
        return x;
    } else {
        if (b < tm) {
            return min(x, get(b, v*2, tl, tm));
        } else {
            return min(x, get(b, v*2+1, tm, tr));
        }
    }
}

pair<ll, ll> solve(ll lambda) {
    fill(tree, tree+4*MAXN, Point(-1));
    add(Point(0));
    for (int i = 1; i <= n; i++) {
        auto opt = get(i);
        dp[i] = opt.first + lambda;
        used[i] = used[opt.second.a] + 1;
        add(Point(i));
    }
    return {dp[n], used[n]};
}

int main()
{
    ios::sync_with_stdio(0); cin.tie(0);
    cin >> n >> k; k++;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        pref[i] = a[i] + pref[i-1];
    }
    ll lo = 0, hi = 1e17;
    while (lo < hi) {
        ll lambda = (lo + hi) / 2;
        auto x = solve(lambda);
        if (x.second <= k) hi = lambda;
        else lo = lambda + 1;
    }
    auto ans = solve(lo);
    cout << (ans.first - lo * ans.second) << "\n";
    return 0;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 27ms 14424 KiB
2 Elfogadva 87ms 15052 KiB
subtask2 10/10
3 Elfogadva 30ms 14868 KiB
4 Elfogadva 29ms 15204 KiB
5 Elfogadva 28ms 15164 KiB
6 Elfogadva 28ms 15500 KiB
7 Elfogadva 28ms 15560 KiB
subtask3 10/10
8 Elfogadva 35ms 15928 KiB
9 Elfogadva 32ms 16108 KiB
10 Elfogadva 35ms 16384 KiB
11 Elfogadva 32ms 16532 KiB
12 Elfogadva 32ms 16592 KiB
subtask4 20/20
13 Elfogadva 96ms 16948 KiB
14 Elfogadva 94ms 16920 KiB
15 Elfogadva 100ms 16980 KiB
16 Elfogadva 97ms 16860 KiB
17 Elfogadva 100ms 16860 KiB
18 Elfogadva 96ms 17048 KiB
subtask5 29/29
19 Elfogadva 842ms 20008 KiB
20 Elfogadva 876ms 19912 KiB
21 Elfogadva 866ms 19960 KiB
22 Elfogadva 884ms 20008 KiB
23 Elfogadva 882ms 19960 KiB
subtask6 31/31
24 Elfogadva 1.715s 23008 KiB
25 Elfogadva 1.71s 23032 KiB
26 Elfogadva 1.763s 23032 KiB
27 Elfogadva 1.804s 23032 KiB
28 Elfogadva 1.819s 23056 KiB
29 Elfogadva 1.812s 23440 KiB
30 Elfogadva 1.86s 23288 KiB
31 Elfogadva 1.889s 23168 KiB
32 Elfogadva 1.85s 23168 KiB
33 Elfogadva 1.886s 23468 KiB
34 Elfogadva 1.851s 23296 KiB
35 Elfogadva 1.884s 23320 KiB
36 Elfogadva 1.85s 23600 KiB
37 Elfogadva 1.871s 23352 KiB
38 Elfogadva 1.87s 23384 KiB
39 Elfogadva 1.868s 23356 KiB
40 Elfogadva 1.873s 23404 KiB