社区讨论
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 条回复,欢迎继续交流。
正在加载回复...