題目鏈結
題目大意:有乙個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 的元素用單調佇列維護好,依次類...