0pts求调
查看原帖
0pts求调
1384818
HeYuChenC楼主2025/6/29 22:00
#include<bits/stdc++.h>
#define int long long
#define valt long double
using namespace std;
int n, k, c, sum[100004] = {0}, f[100004] = {0}, q[100004], head = 1, tail = 1, tmp[100004], fa[100005][205];
int sqr(int a) {
    return a * a;
}
valt Y(int j) {
    return tmp[j] - sqr(sum[j]);
}
valt X(int j) {
    return -sum[j];
}
valt K(int i) {
    return sum[i];
}
valt slope(int j1, int j2) {
    if (X(j1) == X(j2))
            return LONG_LONG_MIN;
    return (Y(j2) - Y(j1)) / (X(j2) - X(j1));
}
signed main() {
    memset(f, 0, sizeof(f));
    scanf("%lld%lld", &n, &k);
    for (int i = 1; i <= n; ++i) scanf("%lld", &c), sum[i] = sum[i - 1] + c;
    for (int s = 0; s <= k; ++s) {
        head = tail = 1; q[0] = q[1] = q[2] = 0;
        for (int i = 1; i <= n; ++i) {
            tmp[i] = f[i], f[i] = 0;
            while (head < tail - 1 && slope(q[head], q[head + 1]) <= K(i)) ++head;
            int j = q[head];
            fa[i][s] = j;
            f[i] = tmp[j] + sum[j] * (sum[i] - sum[j]);
            while (head < tail - 1 && slope(q[tail - 1], q[tail]) >= slope(q[tail], i)) --tail;
            q[++tail] = i;
        }
    }
    printf("%lld\n", f[n]);
    for (int x = fa[n][k]; k; x = fa[x][--k]) printf("%d ", x);
    return 0;
}

斜优 WA 求遽铑帮忙

2025/6/29 22:00
加载中...