80pts 调得相思了
查看原帖
80pts 调得相思了
1305692
xiangixuan楼主2025/6/27 16:51
#include<bits/stdc++.h>
#define N 2005
using namespace std;

int n, m, w, inPri[N], outPri[N], inLim[N], outLim[N];

deque<int> q;
int f[N][N];

int g(int i, int j, bool opt) {
	if(!opt) return f[i-w][j]+j*inPri[i];
	return f[i-w][j]+j*outPri[i];
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> w;
	++w;
	for(int i=1; i<=n; ++i)
		cin >> inPri[i] >> outPri[i] >> inLim[i] >> outLim[i];
	
	memset(f, 128, sizeof f);
	
	for(int i=1; i<=n; ++i) {
		for(int j=0; j<=inLim[i]; ++j)
			f[i][j]=-inPri[i]*j;
		for(int j=0; j<=m; ++j)
			f[i][j]=max(f[i][j], f[i-1][j]);
		if(i<=w+1) continue;
		q.clear();
		for(int j=0; j<=m; ++j) {
			while(q.size() && j-q.front()>inLim[i])
				q.pop_front();
			while(q.size() && g(i, q.back(), 0)<g(i, j, 0))
				q.pop_back();
			q.push_back(j);
			if(q.size()) f[i][j]=max(f[i][j], g(i, q.front(), 0)-j*inPri[i]);
		}
		
		q.clear();
		for(int j=m; ~j; --j) {
			while(q.size() && q.front()-j>outLim[i])
				q.pop_front();
			while(q.size() && g(i, q.back(), 1)<g(i, j, 1))
				q.pop_back();
			q.push_back(j);
			if(q.size()) f[i][j]=max(f[i][j], g(i, q.front(), 1)-j*outPri[i]);
		}
	}
	
	int ans=0;
	for(int i=0; i<=m; ++i)
		ans=max(ans, f[n][i]);
	cout << ans << '\n';
	return 0;
}

WA #7 #10

打开题解一看简直和第一篇题解的写法一模一样.

哪位大佬帮我看看QwQ

2025/6/27 16:51
加载中...