有乙個a*b的整數組成的矩陣,現請你從中找出乙個n*n的正方形區域,使得該區域所有數中的最大值和最小值的差最小.
第一行為3個整數,分別表示a,b,n的值第二行至第a+1行每行為b個非負整數,表示矩陣中相應位置上的數.每行相鄰兩數之間用一空格分隔.
100%的資料2<=a,b<=1000,n<=a,n<=b,n<=1000
僅乙個整數,為ab矩陣中所有"nn正方形區域中的最大整數和最小整數的差值"的最小值.
5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
維護單調佇列,maxx[i][j]表示第i行以j為結尾的長度為min(j,len)的序列最大值;minn[i][j]表示第i行以j為結尾的長度為min(j,len)的序列最小值.
可以相當於使之縮成乙個點,因此有ansx[i][j]表示以(i,j)為右下方端點,邊長為min(j,len)的正方形的最大值;ansn[i][j]表示以(i,j)為右下方端點,邊長為min(j,len)的正方形的最小值.
最後n²列舉右下方端點更新答案即可.
**如下:
#include
#include
#include
#include
#include
#include
#include
#include
#include
using
namespace std;
#define r register
#define ll long long
#define fo(i,a,b) for(r int (i)=(a);(i)<=(b);++(i))
struct node;
int n,m,len,a[1001][1001],maxx[1001][1001],minn[1001][1001];
int ansx[1001][1001],ansn[1001][1001],anss=1e9,l,r;
node q[10001];
node nod(int idd,int da);}
int main()
}fo(i,1,n)
}fo(j,1,m)
}fo(j,1,m)
}fo(i,len,n)
fo(j,len,m)
anss=min(anss,ansx[i][j]-ansn[i][j]);
cout0;}
HAOI 2007 理想的正方形
有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。輸入格式 第一行為3個整數,分別表示a,b,n的值 第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。每行相鄰兩數之間用一空格分隔。輸出格式 僅乙個整數,為a b矩陣中所有 ...
HAOI2007 理想的正方形
時間限制 10 sec 記憶體限制 162 mb 有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值 的差最小。第一行為3個整數,分別表示a,b,n的值第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。每 行相鄰兩數之間用一空格分隔。...
HAOI2007 理想的正方形
x與x所儲存的分別是1 n的長方形內的最大值,最小值。x i j 儲存第i行第jj n 1列的長方形中的最大值。同理,x i j 儲存第i行第jj n 1列的長方形中的最小值。這時再對這兩個陣列的每一列上的值進行維護,將x中每個區間的的最大值用y維護,將x中的每個區間的最小值用y維護。那麼y i j...