Given a matrix of a * B, evaluate a sub-matrix of N * n to minimize the difference between the maximum and minimum values in the matrix.
Maintain a monotonic decreasing queue for each row, and create a vertical queue to maintain the maximum value within n grids.
Calculate the maximum and minimum values twice and obtain the ans.
#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>#define M 1010using namespace std;struct abcd{pair<int,int>queue[M];int r,h;void Insert(int x,int pos);int Get_Num();}qs[M],q;int m,n,k,ans=0x3f3f3f3f;int map[M][M],max_num[M][M],min_num[M][M];void abcd :: Insert(int x,int pos){while(r!=h&&queue[r].first<=x)--r;queue[++r]=make_pair(x,pos);while(queue[h+1].second<=pos-k)++h;}int abcd :: Get_Num(){return queue[h+1].first;}int main(){int i,j;cin>>m>>n>>k;for(i=1;i<=m;i++)for(j=1;j<=n;j++)scanf("%d",&map[i][j]);for(i=1;i<=m;i++)for(j=1;j<k;j++)qs[i].Insert(map[i][j],j);for(j=k;j<=n;j++){for(i=1;i<=m;i++)qs[i].Insert(map[i][j],j);memset(&q,0,sizeof q);for(i=1;i<k;i++)q.Insert(qs[i].Get_Num(),i);for(i=k;i<=m;i++)q.Insert(qs[i].Get_Num(),i),max_num[i][j]=q.Get_Num();}memset(qs,0,sizeof qs);for(i=1;i<=m;i++)for(j=1;j<k;j++)qs[i].Insert(-map[i][j],j);for(j=k;j<=n;j++){for(i=1;i<=m;i++)qs[i].Insert(-map[i][j],j);memset(&q,0,sizeof q);for(i=1;i<k;i++)q.Insert(qs[i].Get_Num(),i);for(i=k;i<=m;i++)q.Insert(qs[i].Get_Num(),i),min_num[i][j]=-q.Get_Num();}for(i=k;i<=m;i++)for(j=k;j<=n;j++)ans=min(ans,max_num[i][j]-min_num[i][j]);cout<<ans<<endl;}
Bzoj 1047 haoi2007 ideal square monotonous queue