0分蒟蒻求助 P2216 理想的正方形
查看原帖
0分蒟蒻求助 P2216 理想的正方形
344928
jialinyyzz楼主2020/10/15 19:32
#include <bits/stdc++.h>
using namespace std;

int n,m,k,head=1,front,tail=1,back,ans=INT_MAX;
int a[1001][1001],q[1001],q1[1001];
int x[1001][1001],y[1001][1001];
int z[1001][1001],z1[1001][1001];
int main(){
	cin>>n>>m>>k;
	for (int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>a[i][j];
	for(int i=1;i<=n;i++){
		q[1]=1;
		head=tail=1;
		for(int j=2;j<=m;j++){
			if(j-q[head]>k)head++;
			while(head<=tail&&(a[i][q[tail]]<a[i][j]))tail--;
			q[++tail]=j;
			if(j>=k)x[i][++back]=a[i][q[head]];
		}
	}
	for(int i=1;i<=back;i++){
		q1[1]=1;
		head=tail=1;
		for(int j=2;j<=n;j++){
			if(j-q[head]>k)head++;
			while(head<=tail&&(a[q[tail]][i]<a[j][i]))tail--;
			q[++tail]=j;
			if(j>=k)y[++front][i]=a[q[head]][i];
		}
	}
	front=back=0;
	for(int i=1;i<=n;i++){
		q[1]=1;
		head=tail=1;
		for(int j=2;j<=m;j++){
			if(j-q[head]>k)head++;
			while(head<=tail&&(a[i][q[tail]]>a[i][j]))tail--;
			q[++tail]=j;
			if(j>=k)z[i][++back]=a[i][q[head]];
		}
	}
	for(int i=1;i<=back;i++){
		q1[1]=1;
		head=tail=1;
		for(int j=2;j<=n;j++){
			if(j-q[head]>k)head++;
			while(head<=tail&&(a[q[tail]][i]>a[j][i]))tail--;
			q[++tail]=j;
			if(j>=k)z1[++front][i]=a[q[head]][i];
		}
	}
	for(int i=1;i<=front;i++)
		for(int j=1;j<=back;j++){
			if(y[i][j]-z1[i][j]<ans)ans=y[i][j]-z1[i][j];
		}
	cout<<ans;		
	return 0;	
}
2020/10/15 19:32
加载中...