求助 P5858 「SWTR-03」Golden Sword
  • 板块学术版
  • 楼主Uuuuuur_
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/21 12:17
  • 上次更新2023/10/27 14:19:58
查看原帖
求助 P5858 「SWTR-03」Golden Sword
536396
Uuuuuur_楼主2022/8/21 12:17
#include <iostream>
#include <algorithm>
#include <queue>
#include <cstring>

using namespace std;
typedef long long ll;
deque<pair<ll, int> > q;
int n, w, s;
ll a[5005];
ll f[5005][5005];
ll last =-0x3f3f3f3f3f3f3f3f ;
ll ans = -0x3f3f3f3f3f3f3f3f;

ll maxx = -0x3f3f3f3f3f3f3f3f;

int main() {
	cin >> n >> w >> s;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
	}
	
	for (int i = 1; i <= 5004; i++) {
		for (int j = 0; j <= 5004; j++) {
			f[i][j] = -0x3f3f3f3f3f3f3f3f;
		}
	}
	
	for (int i = 1; i <= n; i++) {
		q.clear();
		for (int j = 0; j <= s; j++) {
			
			while (!q.empty() && q.back().first <= f[i - 1][j]) q.pop_back();
			q.push_back(make_pair(f[i - 1][j], j));
			
			//while (!q.empty() && q.front().second <= j - s) q.pop_front();
		}
		f[i][1] = a[i] + q.front().first;
		if (i == n) ans = max(ans, f[i][1]);
		for (int j = 2; j <= min(w, i); j++) {
			while (!q.empty() && q.back().first <= f[i - 1][s + j - 1]) q.pop_back();
			q.push_back(make_pair(f[i - 1][s + j - 1], s + j - 1));
			while (!q.empty() && q.front().second <= j - 2) q.pop_front();
			f[i][j] = max(f[i][j], a[i] * j + q.front().first);
			if (i == n) ans = max(ans, f[i][j]);
		}
	}
	cout << ans;
	return 0;
}

只有55分,WA了

2022/8/21 12:17
加载中...