社区讨论

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 条回复,欢迎继续交流。

正在加载回复...