p2216 单调队列30分求助
  • 板块学术版
  • 楼主pl_cosmonaut
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/5/6 13:01
  • 上次更新2023/10/28 02:03:45
查看原帖
p2216 单调队列30分求助
545507
pl_cosmonaut楼主2022/5/6 13:01
#include<bits/stdc++.h>
using namespace std;
int a,b,n;
int mig[1001][1001],M[1001][1001],m[1001][1001],que[1001],size=0,head=1,tail=0;
int Y[1001][1001],y[1001][1001];
void solve_max(){
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			while(size!=0 && que[tail]<mig[i][j]){
				que[head]=0;
				head++;
				size--;
			}
			que[++tail]=mig[i][j];
			size++;
			if(j>=n){
				while(size>n){
					que[head]=0;
					head++;
					size--;
				}
				M[i][j-n+1]=que[head];
				
				
			}
		}
		memset(que,0,sizeof(que));
		size=0;head=1;tail=0;
	}
	
	
	for(int i=1;i<=b-n+1;i++){
		for(int j=1;j<=a;j++){
			while(size!=0 && que[tail]<M[j][i]){
				que[head]=0;
				head++;
				size--;
			}
			que[++tail]=M[j][i];
			size++;
			if(j>=n){
				while(size>n){
					que[head]=0;
					head++;
					size--;
				}
				Y[j-n+1][i]=que[head];
				
				
			}
		}
		memset(que,0,sizeof(que));
		size=0;head=1;tail=0;
	}
}

void solve_min(){
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			while(size!=0 && que[tail]>mig[i][j]){
				que[head]=0;
				head++;
				size--;
			}
			que[++tail]=mig[i][j];
			size++;
			if(j>=n){
				while(size>n){
					que[head]=0;
					head++;
					size--;
				}
				m[i][j-n+1]=que[head];
				
				
			}
		}
		memset(que,0,sizeof(que));
		size=0;head=1;tail=0;
	}
	
	
	for(int i=1;i<=b-n+1;i++){
		for(int j=1;j<=a;j++){
			while(size!=0 && que[tail]>m[j][i]){
				que[head]=0;
				head++;
				size--;
			}
			que[++tail]=m[j][i];
			size++;
			if(j>=n){
				while(size>n){
					que[head]=0;
					head++;
					size--;
				}
				y[j-n+1][i]=que[head];
				
				
			}
		}
		memset(que,0,sizeof(que));
		size=0;head=1;tail=0;
	}
}

int main(){
	cin>>a>>b>>n;
	for(int i=1;i<=a;i++){
		for(int j=1;j<=b;j++){
			cin>>mig[i][j];
		}
	}
	solve_max();
	solve_min();
	int mmmin=2147483647;
	for(int i=1;i<=a-n+1;i++){
		for(int j=1;j<=b-n+1;j++){
			mmmin=min(mmmin,Y[i][j]-y[i][j]);
		}
	}
	
	cout<<mmmin;
	return 0;
} 
2022/5/6 13:01
加载中...