69岁,已经疯了
查看原帖
69岁,已经疯了
117799
Rossie65536楼主2021/1/20 23:06

一直 WA,也不知道原因 QwQ

#include <bits/stdc++.h>

using namespace std;

const int N = 5e4 + 5;
int n, l;
int a[N], s[N];
int f[N], q[N], tail, head;

inline int x(int i) {
    return s[i];
}

inline int y(int i) {
    return f[i] + s[i] * s[i];
}

inline int k(int i) {
    return 2 * (s[i] - l);
}

inline long double calc(int i, int j) {
    return (long double)(y(i) - y(j)) / (long double)(x(i) - x(j));
}

int main() {
#ifndef ONLINE_JUDGE
    freopen("project.in", "r", stdin);
    freopen("project.out", "w", stdout);
#endif
    ios::sync_with_stdio(false);
    cin >> n >> l;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int i = 1; i <= n; ++i) s[i] = s[i - 1] + a[i];
    for (int i = 1; i <= n; ++i) s[i] += i;
    ++l;
    q[tail = head = 1] = 0;
    for (int i = 1; i <= n; ++i) {
        while (head < tail && calc(q[head + 1], q[head]) < k(i)) ++head;
        f[i] = f[q[head]] + (s[i] - s[q[head]] - l) * (s[i] - s[q[head]] - l);
        while (head < tail && calc(q[tail], q[tail - 1]) > calc(i, q[tail - 1])) --tail;
        q[++tail] = i;
    }
    cout << f[n] << '\n';
    return 0;
}
2021/1/20 23:06
加载中...