社区讨论
MnZn刚学OI114514秒,求助20ptsWA
P2569[SCOI2010] 股票交易参与者 2已保存回复 2
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 2 条
- 当前快照
- 1 份
- 快照标识符
- @lo2guyii
- 此快照首次捕获于
- 2023/10/23 13:37 2 年前
- 此快照最后确认于
- 2023/10/23 13:37 2 年前
CPP
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 2005;
int T, maxp, W, ap[maxn], bp[maxn], as[maxn], bs[maxn], f[maxn][maxn];
struct MonoQ_max {
deque<pair<int, int> > q;
int lim;
MonoQ_max() {}
MonoQ_max(int _lim):
lim(_lim)
{}
void insert(int x, int pos) {
while (q.size() && q.front().second <= pos - lim) q.pop_front();
while (q.size() && q.front().first < x) q.pop_back();
q.push_back(make_pair(x, pos));
}
};
signed main() {
cin >> T >> maxp >> W;
for (int i = 1; i <= T; ++i) {
cin >> ap[i] >> bp[i] >> as[i] >> bs[i];
}
memset(f, 0xaf, sizeof f);
for (int i = 1; i <= T; ++i) {
for (int j = 0; j <= min(maxp, as[i]); ++j) f[i][j] = -j * ap[i]; //Buying in (min(maxp, as[i]) at most)
}
for (int i = 1; i <= W; ++i) {
for (int j = 0; j <= maxp; ++j) {
f[i][j] = max(f[i][j], f[i - 1][j]);
} //no action
}
for (int i = W + 1; i <= T; ++i) {
for (int j = 0; j <= maxp; ++j) {
f[i][j] = max(f[i][j], f[i - 1][j]);
} //no action
MonoQ_max q1(as[i]);
//to buy in from k: f[i][j] = max(f[i - w - 1][k]) - (j - k) * ap[i] (max(j - as[i], 0) <= k < j);
//to sell out from k: f[i][j] = max(f[i - w - 1][k]) + (k - j) * bp[i] (j < k <= min(maxp, j + bp[i]));
for (int j = 0; j < as[i]; ++j) {
q1.insert(f[i - W - 1][j], j);
}
for (int j = as[i]; j <= maxp; ++j) {
f[i][j] = max(f[i][j], q1.q.front().first - (j - q1.q.front().second) * ap[i]);
q1.insert(f[i - W - 1][j], j);
}
MonoQ_max q2(bs[i]);
for (int j = maxp; j > bs[i]; --j) {
q2.insert(f[i - W - 1][j], maxp - j + 1);
}
for (int j = bs[i]; j >= 0; --j) {
f[i][j] = max(f[i][j], q2.q.front().first + ((maxp - q2.q.front().second + 1 - j) * bp[i]));
q2.insert(f[i - W - 1][j], maxp - j + 1);
}
// for (int j = 0; j <= maxp; ++j) {
// cerr << f[i][j] << ' ';
// }
// cerr << endl;
}
int ans = 0;
for (int j = 0; j <= maxp; ++j) {
ans = max(ans, f[T][j]);
}
cout << ans << endl;
return 0;
}
回复
共 2 条回复,欢迎继续交流。
正在加载回复...