理想的正方形(單調佇列在二維的應用)

2022-05-29 18:39:08 字數 2335 閱讀 7478

理想的正方形

題解:

用單調佇列分別維護行與列。

這裡只講求 n*n 區間內的最大值的維護方法,最小值同樣的方法維護即可。

具體實現方法:

**說明:

原陣列:mat,列陣列:q;

遍歷每一行,當行達到了n,就說明列向已經滿足了n,這個時候就開始在行內維護n長度的最大值了(也就是說我的**並沒有完全等到y_max構造完就開始構造x_max了)

ac_code:

1 #include2

using

namespace

std;

3const

int maxn=1e3+10;4

const

int inf = 0x3f3f3f3f;5

6struct

container

10void push(int

n)16

void pop(int

n)20

int_max()

23int

_min()

26};

2728

intmain()

2937

}38 vectorq(b);//列39

int ans =inf;

40for(int i=0; i)45}

46for(int j=0;j//

縱向維護

47q[j].push(mat[i][j]);48}

49if( i1 ) continue; //

因為要是n*n的,所以首先要滿足縱向長度達到了n

50container c;

51for(int j=0;j//

橫向維護

52if( j-n>=0)56

c.push(q[j]._max());

57c.push(q[j]._min());

58if( j>=n-1 ) ans = min(ans,c._max()-c._min());59}

60}61 printf("

%d\n

",ans);

62return0;

63 }

1 #include2

using

namespace

std;

3const

int maxn=1e3+10;4

const

int inf = 0x3f3f3f3f;5

6struct

node;

10 dequecol_qmin[maxn], col_qmax[maxn], row_qmin, row_qmax;

11int

mat[maxn][maxn];

1213

intmain()

1425}26

for(int j=0;j));

29while( col_qmax[j].size() && col_qmax[j].back().val

30col_qmax[j].push_back(node);31}

3233

if( i1 ) continue;34

row_qmin.clear(); row_qmax.clear();

3536

for(int j=0;j)

41while( row_qmin.size() && row_qmin.back().val>col_qmin[j].front().val ) row_qmin.pop_back();

42row_qmin.push_back(node);

43while( row_qmax.size() && row_qmax.back().val

44row_qmax.push_back(node);

4546

if( j>=n-1)49

}50}51 printf("

%d\n

",ans);

52return0;

53 }

BZOJ 1047 理想的正方形 單調佇列

剛開始用二維rmq直接給超記憶體了。用單調佇列可以做到o n 2 的複雜度。具體是先把每行用單調佇列處理一下。再把處理後的用列單調佇列處理下。include include include include include include include include include include...

理想的正方形

有乙個a x b的整數組成的矩陣,現請你從中找出乙個n x n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。第一行為三個整數,分別表示a,b,n的值 第二行至第a 1行每行為b個非負整數,表示矩陣中相應位置上的數。輸出僅乙個整數,為axb矩陣中所有nxn正方形區域中的最大整數和最小整數的...

理想的正方形 HAOI2007 二維RMQ

省隊選拔賽河南 時間限制 1 s 空間限制 256000 kb 題目等級 大師 master 有乙個a b的整數組成的矩陣,現請你從中找出乙個n n的正方形區域,使得該區域所有數中的最大值和最小值的差最小。輸入描述 input description 第一行為3個整數,分別表示a,b,n的值 第二行...