理想的正方形
題解:
用單調佇列分別維護行與列。
這裡只講求 n*n 區間內的最大值的維護方法,最小值同樣的方法維護即可。
具體實現方法:
**說明:
原陣列:mat,列陣列:q;
遍歷每一行,當行達到了n,就說明列向已經滿足了n,這個時候就開始在行內維護n長度的最大值了(也就是說我的**並沒有完全等到y_max構造完就開始構造x_max了)
ac_code:
1 #include2using
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 #include2using
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的值 第二行...