单调队列求调30pts
查看原帖
单调队列求调30pts
537046
大眼仔Happy楼主2023/11/4 11:23

rt,马蜂最近有点奇怪,但是挺短

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+5,inf=1e9;
int inline read()
{
	int num=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){num=(num<<3)+(num<<1)+(ch^48);ch=getchar();}
	return num*f;
}
int r,c,n,h,t,a[N][N],mx[N][N],mn[N][N],x[N],y[N],q[N],Ans=inf;
void calc(int siz)
{
	h=1;t=0;
	for(int i=1;i<=siz;i++)
	{
		while(h<=t&&x[q[t]]<=x[i])t--;q[++t]=i;
		while(h<=t&&q[h]<=i-n)h++;y[i]=q[h];
	}
}
void solve(int ans[N][N])
{
	for(int i=1;i<=r;i++)
	{
		for(int j=1;j<=c;j++)x[j]=a[i][j];
		calc(c);
		for(int j=1;j<=c;j++)ans[i][j]=a[i][y[j]];
	}
	for(int j=1;j<=c;j++)
	{
		for(int i=1;i<=r;i++)x[i]=ans[i][j];
		calc(r);
		for(int i=1;i<=r;i++)ans[i][j]=ans[y[i]][j];
	}
}
int main(){
	r=read();c=read();n=read();
	for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)a[i][j]=read();solve(mx);
	for(int i=1;i<=r;i++)for(int j=1;j<=c;j++)a[i][j]=-a[i][j];solve(mn);
	for(int i=n;i<=r;i++)for(int j=n;j<=c;j++)Ans=min(Ans,mx[i][j]+mn[i][j]);
	printf("%d",Ans);
	return 0;
}
2023/11/4 11:23
加载中...