1047 HAOI2007 理想的正方形

2021-07-29 22:58:38 字數 812 閱讀 9549

題目鏈結

題目大意:有乙個a*b的整數組成的矩陣,現請你從中找出乙個n*n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。

題解:顯然二維rmq就可以過了……但是用二維滑動視窗可以o(n^2)維護……

找矩陣中的最小值時維護單調上公升佇列,橫豎各一遍即可

我的收穫:單調佇列神啊

#include 

#include

#include

#include

#include

using

namespace

std;

#define m 1005

#define inf int_max-1

int n,m,k;

int a[m][m],b[m][m][2];//b[i][j]表示第i行/列向後延伸j格的最值

struct queq[m*10];

inline

bool cmp(int x,int y,bool k)//k=1時相反,k=0時相同

void get(int f);

b[i][j][f]=q[l].v;}}

}void work()

int ans=inf;

for(int i=k;i<=n;i++)

for(int j=k;j<=m;j++)

ans=min(ans,b[i][j][1]-b[i][j][0]);

printf("%d",ans);

}void init()

int main()

bzoj1047 haoi2007 理想正方形

time limit 10 sec memory limit 162 mb submit 2151 solved 1146 submit status discuss 有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。第一行為3個整數,分...

bzoj1047 haoi2007 理想的正方形

有乙個a b a ba b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。輸入格式 第一行為3個整數,分別表示a,b,n的值 第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。輸出格式 僅乙個整數,為ab...

BZOJ1047 HAOI2007 理想的正方形

佇列 題目傳送門 對於每一行用單調不增和單調不減佇列分別維護最小值和最大值。對於列,也用單調不增和單調不減佇列分別維護最小值和最大值。步驟如下 1 每一行分別把前 n 個數的單調佇列建好。2 取出每一行隊頭的元素用列的單調佇列維護並更新答案。3 把每一行在 2,n 1 的元素用單調佇列維護好,依次類...