BZOJ 1047 理想的正方形

2022-08-18 22:36:18 字數 1057 閱讀 1023

看到這到題,第一反應當然是暴搜一遍,但是資料較大,暴搜鐵定過不了,自然想到進行優化,優化的方案很多,每個人的思路可能不同,在這裡我的思路僅供參考。

我的想法是用單調佇列、單調棧,當然簡單的單調佇列、單調棧只適用於一行資料,對於這道題要進行一定的組合和變換。根據題目的介紹,可以大致總結出以下資訊:第一,矩陣由b組長度為a的數列組成;第二,求的範圍是m*m。因而,我們可以先取第一行進行考慮,簡單的理解為依次輸入每乙個資料,輸入乙個求取一下後m個資料中的最大值,並將之記錄進乙個新建陣列,求取過程就是最裸的單調佇列、單調棧,將每一行進行求值得到了一組新資料,這組資料記錄了原資料橫向上每m個中的最大值,也就是m*m方陣中每行的最大值,再將資料按豎著的方向進行上述操作,輸入乙個求一次後m個中的最大值,這樣得到的就是最終結果。(如果有不理解的,請看下圖)

題目的大致程式如下:

#include #include 

#include

#include

#include

#define inf 0x3f3f3f3f

using

namespace

std;

inti_long,i_wide,i_side;

int g[1005][1005],f[1005][1005][2],t[1005][1005

];struct

quq[

1005

];void getgf(int

k) }

for (int i=i_side;i<=i_long;i++)

}}int

main()

}getgf(0);

for (int i=1;i<=i_long;i++)

}getgf(1);

int ans=inf;

for (int i=i_side;i<=i_long;i++)

}cout

return0;

}

希望所寫內容對您有所幫助,謝謝。

BZOJ1047 理想的正方形

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

BZOJ 1047 理想的正方形

bzoj 1047 傳送門 1 先橫向用單調佇列求出每個數左邊 n 個數中的最值 2 再縱向利用橫向的結果用單調佇列進行相同的操作 通過以上操作將 a b 的矩陣轉化為了 a n 1 b n 1 的矩陣 相當於每個正方形被縮成了乙個點,而每個點的最值就代表著原正方形中的最值 tip 1 又被 1 2...

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

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