单调队列保龄求助,WA+TLE
查看原帖
单调队列保龄求助,WA+TLE
546681
lcbridgeAK CSP-S楼主2023/1/31 16:46

RT #2#3WA,其余TLE,谢谢

#include <bits/stdc++.h>
using namespace std;
int a,b,n,m[1005][1005];
int q[1005],q1[1005],rmax[1005][1005],cmax[1005][1005],rmin[1005][1005],cmin[1005][1005];
int main(){
	scanf("%d%d%d",&a,&b,&n);
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			scanf("%d",&m[i][j]);
		}
	}
	for(int i=1;i<=a;i++){
		int l=0,r=0;
		for(int j=1;j<=b;j++){
			while(l<=r&&q[l]+n<j)l++;
			while(l<=r&&m[i][j]>m[i][q[r]])r--;
			q[++r]=j;
			if(j>=n)rmax[i][j-n+1]=m[i][q[l]];
		}
		l=0,r=0;
		for(int j=1;j<=b;j++){
			while(l<=r&&q[l]+n<j)l++;
			while(l<=r&&m[i][j]<m[i][q[r]])r--;
			q[++r]=j;
			if(j>=n)rmin[i][j-n+1]=m[i][q[l]];
		}
		for(int j=1;j<=b-n+1;j++){
			int l=0,r=0;
			for(int k=1;k<=a;k++){
				while(l<=r&&q[l]+n<k)l++;
				while(l<=r&&rmax[k][j]>rmax[q[r]][j])r--;
				q[++r]=k;
				if(k>=n)cmax[k-n+1][j]=rmax[q[l]][j];
			}
			l=0,r=0;
			for(int k=1;k<=a;k++){
				while(l<=r&&q[l]+n<k)l++;
				while(l<=r&&rmin[k][j]<rmin[q[r]][i])r--;
				q[++r]=k;
				if(k>=n)cmin[k-n+1][j]=rmin[q[l]][j];
			}
		}
	}
	int ans=0x3f3f3f3f;
	for(int i=1;i<=a-n+1;i++){
		for(int j=1;j<=b-n+1;j++){
			//cout<<'('<<cmax[i][j]<<' '<<cmin[i][j]<<')';
			ans=min(ans,cmax[i][j]-cmin[i][j]);
		}
		cout<<endl;
	}
	printf("%d",ans);
	return 0;
}
2023/1/31 16:46
加载中...