70pts 求调,#4#5#9过不去,单调队列优化dp板子
查看原帖
70pts 求调,#4#5#9过不去,单调队列优化dp板子
238826
MTEzNUc3楼主2024/11/3 18:07
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define maxn 4010

using namespace std;

int a[maxn][maxn],d[maxn][maxn];
struct p
{
	int idx,v;
};
int main()
{
//	freopen("P3800_2.in","r",stdin);
	int n,m,k,t;
	scanf("%d%d%d%d",&n,&m,&k,&t);
	while(k--) 
	{
		int x,y,v;
		scanf("%d%d%d",&x,&y,&v);
		a[x][y]=v;
	}
	int ans=0;
	for(int i=1;i<=n;++i)
	{
		deque<p> q;
		for(int j=1;j<=t;++j)
		{
			while(!q.empty()&&q.back().v<=d[i-1][j]) q.pop_back();
			q.push_back((p){j,d[i-1][j]});
		}
		for(int j=1;j<=m;++j)
		{
			d[i][j]=q.front().v+a[i][j];
			while(!q.empty()&&q.front().idx<j-t) q.pop_front();
			if(j+t<=m)
			{
				while(!q.empty()&&q.back().v<=d[i-1][j+t]) q.pop_back();
				q.push_back((p){j+t,d[i-1][j+t]});
			}
		}
	}
	for(int i=1;i<=m;++i) ans=max(ans,d[n][i]);
	printf("%d",ans);
}
2024/11/3 18:07
加载中...