关于枚举顺序
查看原帖
关于枚举顺序
929863
Stars_never_set楼主2023/7/21 22:22

不懂就问,这道题为什么需要倒序枚举 jj,正着枚举样例过不了。

#include<bits/stdc++.h>
#define int long long
#define pii pair<int,int>
using namespace std;
const int N=1e4+6;
const int M=1e3+7;
const int IM=214748364;
const long long LLM=922337203685477580;

inline int read()
{
	int x=0,y=1;char c=getchar();
	while(c<'0'||c>'9'){if(c=='-') y=-y;c=getchar();}
	while(c>='0'&&c<='9'){x=x*10+(c^'0');c=getchar();}
	return x*y;
}

int n,w,s,a[N],f[5001][5001];
deque<pii >q;

void update(int x,int pos)
{
	while(q.size()&&q.back().first<=x) q.pop_back();
	q.push_back(make_pair(x,pos));
}

signed main()
{
	n=read(),w=read(),s=read();
	for(int i=0;i<=n;i++)
		for(int j=0;j<=w;j++)
			f[i][j]=-IM+1;
	for(int i=1;i<=n;i++) a[i]=read();
	f[1][1]=a[1];
	for(int i=2;i<=n;i++)
	{
		while(q.size()) q.pop_front();
		if(i>w) update(f[i-1][w],w);
//		for(int j=1;j<=min(i,w);j++)
		for(int j=min(i,w);j;j--)
		{
			if(j-1) update(f[i-1][j-1],j-1);
			while(q.size()&&q.front().second-j>=s) q.pop_front();
			f[i][j]=q.front().first+j*a[i];
		}
	}
	int ans=-LLM;
	for(int i=0;i<=w;i++) ans=max(ans,f[n][i]);
	printf("%lld\n",ans);
	return 0;
}
2023/7/21 22:22
加载中...