单调队列 WA 20pts 求调玄关
查看原帖
单调队列 WA 20pts 求调玄关
604906
Guizy楼主2024/11/13 20:15
#include<bits/stdc++.h>
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;

const int Max=1050;
int n,m,k,a[Max][Max];
int amx[Max][Max],ami[Max][Max];
int bmx[Max][Max],bmi[Max][Max];
int qmx[Max],qmi[Max],tmx[Max],tmi[Max];

signed main(){
	
	cin>>n>>m>>k;
	rep(i,1,n){
		memset(qmx,0,sizeof qmx);
		memset(qmi,0,sizeof qmi);
		memset(tmx,0,sizeof tmx);
		memset(tmi,0,sizeof tmi);
		int lmx=1,rmx=0,lmi=0,rmi=0;
		rep(j,1,m){
			cin>>a[i][j];
			while(tmx[lmx]+k<=j&&lmx<=rmx) lmx++;
			while(tmx[lmi]+k<=j&&lmi<=rmi) lmi++;
			while(lmx<=rmx&&qmx[rmx]<a[i][j]) rmx--;
			while(lmi<=rmi&&qmi[rmi]>a[i][j]) rmi--;
			qmx[++rmx]=qmi[++rmi]=a[i][j];
			tmx[rmx]=tmi[rmi]=j; 
			if(j>=k) amx[i][j-k+1]=qmx[lmx],ami[i][j-k+1]=qmi[lmi];
		}
	}
	rep(j,1,m-k+1){
		memset(qmx,0,sizeof qmx);
		memset(qmi,0,sizeof qmi);
		memset(tmx,0,sizeof tmx);
		memset(tmi,0,sizeof tmi);
		int lmx=1,rmx=0,lmi=0,rmi=0;
		rep(i,1,n){
			while(tmx[lmx]+k<=i&&lmx<=rmx) lmx++;
			while(tmi[lmi]+k<=i&&lmi<=rmi) lmi++;
			while(lmx<=rmx&&qmx[rmx]<amx[i][j]) rmx--;
			while(lmi<=rmi&&qmi[rmi]>ami[i][j]) rmi--;
			qmx[++rmx]=amx[i][j],qmi[++rmi]=ami[i][j];
			tmx[rmx]=tmi[rmi]=i; 	
			if(i>=k) bmx[i-k+1][j]=qmx[lmx],bmi[i-k+1][j]=qmi[lmi];
		}
	}
	int ans=INT_MAX;
	rep(i,1,n-k+1)
		rep(j,1,m-k+1)
			ans=min(bmx[i][j]-bmi[i][j],ans);
	cout<<ans;	
	return 0;
}
2024/11/13 20:15
加载中...