78分 2个WA 大佬求调
查看原帖
78分 2个WA 大佬求调
1802594
Stick_Man_楼主2025/7/22 18:40
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N = 1e5 + 5, K = 205;
int n, k, a[N], q[N], pre[K][N];
ll sum[N], f[K][N];

inline ll X(int i) { return sum[i]; }
inline ll Y(int j, int i) { return f[j][i] - sum[i] * sum[i]; }
inline double slope(int j, int k1, int k2) {
    if (X(k2) == X(k1)) return Y(j, k2) > Y(j, k1) ? 1e18 : -1e18;
    return (double)(Y(j, k2) - Y(j, k1)) / (X(k2) - X(k1));
}

int main() {
    scanf("%d%d", &n, &k);
    for (int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        sum[i] = sum[i - 1] + a[i];
    }

    for (int j = 1; j <= k; j++) {
        int l = 0, r = 0;
        q[0] = 0;
        for (int i = 1; i <= n; i++) {
            while (l < r && slope(j - 1, q[l], q[l + 1]) >= -sum[i]) l++;
            int p = q[l];
            f[j][i] = f[j - 1][p] + sum[p] * (sum[i] - sum[p]);
            pre[j][i] = p;
            while (l < r && slope(j - 1, q[r - 1], q[r]) <= slope(j - 1, q[r], i)) r--;
            q[++r] = i;
        }
    }

    printf("%lld\n", f[k][n]);
    stack<int> st;
    for (int i = k, pos = n; i >= 1; i--) {
        pos = pre[i][pos];
        st.push(pos);
    }
    while (!st.empty()) {
        printf("%d ", st.top());
        st.pop();
    }
    return 0;
}

2025/7/22 18:40
加载中...