P2216 [HAOI2007] 理想的正方形

P2216 [HAOI2007] 理想的正方形

 

#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e3 + 10;
int a,b,n;
int c[maxn][maxn];
deque <int> dq1,dq2;
int max1[maxn][maxn],min1[maxn][maxn];
int max2[maxn][maxn],min2[maxn][maxn];

int ans = 2e9;

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cin >> a >> b >> n; 
	for(int i = 1; i <= a; i++){
		for(int j = 1; j <= b; j++){
			cin >> c[i][j];
		} 
	}
	
	for(int i = 1; i <= a; i++){
		dq1.clear();dq2.clear();
		for(int j = 1; j <= b; j++){
			while(!dq1.empty() && j - dq1.front() + 1 > n) dq1.pop_front();
			while(!dq1.empty() &&c[i][dq1.back()] <= c[i][j]) dq1.pop_back();
			dq1.push_back(j);
			if(j >= n) max1[i][j - n + 1] = c[i][dq1.front()];
			
			while(!dq2.empty() && j - dq2.front() + 1 > n) dq2.pop_front();
			while(!dq2.empty() &&c[i][dq2.back()] >= c[i][j]) dq2.pop_back();
			dq2.push_back(j);
			if(j >= n) min1[i][j - n + 1] = c[i][dq2.front()];
		} 
	}
	
	for(int j = 1; j <= b - n + 1; j++){
		dq1.clear();dq2.clear();
		for(int i = 1; i <= a; i++){
			while(!dq1.empty() && i - dq1.front() + 1 > n) dq1.pop_front();
			while(!dq1.empty() && max1[i][j] >= max1[dq1.back()][j]) dq1.pop_back();
			dq1.push_back(i);
			if(i >= n) max2[i - n + 1][j] = max1[dq1.front()][j];
			
			while(!dq2.empty() && i - dq2.front() + 1 > n) dq2.pop_front();
			while(!dq2.empty() && min1[i][j] <= min1[dq2.back()][j]) dq2.pop_back();
			dq2.push_back(i);
			if(i >= n) min2[i - n +1][j] = min1[dq2.front()][j];
		}
	}
	
	for(int i = 1; i <= a - n +1; i++){
		for(int j = 1; j <= b - n +1; j++){
			ans = min(ans,max2[i][j] - min2[i][j]);
		}
	}
	cout << ans;
	return 0;
}

  

posted @ 2025-09-18 17:12  Hazelxcf  阅读(2)  评论(0)    收藏  举报