社区讨论

69岁,已经疯了

P3195[HNOI2008] 玩具装箱参与者 2已保存回复 6

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
6 条
当前快照
1 份
快照标识符
@locpu5h7
此快照首次捕获于
2023/10/30 17:46
2 年前
此快照最后确认于
2023/11/05 04:36
2 年前
查看原帖
一直 WA,也不知道原因 QwQ
CPP
#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;
}

回复

6 条回复,欢迎继续交流。

正在加载回复...