社区讨论
悬关求调斜率优化模板 93pts WA #11
P4360[CEOI 2004] 锯木厂选址参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lt448r9o
- 此快照首次捕获于
- 2024/02/27 16:38 2 年前
- 此快照最后确认于
- 2024/02/27 19:33 2 年前
rt,实在没看出来问题,求大佬帮看看,十分感谢!
状态表示: 为在 处建立第 个锯木厂的费用,答案为 ;
状态转移:,其中 为原 的前缀和, 为 的前缀和( 为原 ), 为原 的前缀和。
CPP#include <iostream>
#include <queue>
#define front q.front()
#define back q.back()
#define sfront *(q.begin() + 1)
#define sback *(q.rbegin() + 1)
#define int long long
using namespace std;
const int N = 2e4 + 5;
int n, w[N], d[N], x[N], f[N][5];
deque<int> q;
signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
cin >> n;
for (int i = 1; i <= n; i++)
cin >> w[i] >> d[i + 1];
for (int i = 1; i <= n + 1; i++)
d[i] += d[i - 1], x[i] = x[i - 1] + w[i] * d[i], w[i] += w[i - 1], f[i][1] = w[i] * d[i] - x[i];
for (int k = 2; k <= 3; k++)
{
q.push_back(k - 1);
for (int i = k; i <= n + 1; i++)
{
while (q.size() > 1 &&
f[sfront][k - 1] + x[sfront] - f[front][k - 1] - x[front] <= (w[sfront] - w[front]) * d[i])
q.pop_front();
f[i][k] = f[front][k - 1] + (w[i] - w[front]) * d[i] - x[i] + x[front];
while (q.size() > 1 && (f[i][k - 1] + x[i] - f[back][k - 1] - x[back]) * (w[back] - w[sback]) <=
(f[back][k - 1] + x[back] - f[sback][k - 1] - x[sback]) * (w[i] - w[back]))
q.pop_back();
q.push_back(i);
}
}
cout << f[n + 1][3] << "\n";
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...