P1440 求m區間內的最小值

2022-08-13 01:15:15 字數 646 閱讀 9220

這道題就是經典的滑動視窗問題了。要求你求某乙個數的前\(m\)位中的最小元素。

先說一句話:單調佇列中,隊首儲存的是最優解,其實是次解,以此類推

所以我們可以構造乙個上公升的單調佇列,隊首弄出來的就是答案。

元素的加入不用說,就是那樣子。

重點是這裡多了元素的刪除。因為視窗的長度有限,你需要把當前視窗沒有覆蓋住的那些點給pop掉。

可以發現,你要刪除的點一定是在隊首!並且每乙個時刻的最優解也還是隊首。

我們只需要加入乙個點的同時記錄它的加入時間,然後判斷是否合法即可。

不知道是先刪除後加入還是怎麼的,我並沒有什麼深刻理解。

luogu**的單調佇列真的寫得特別好!飛機票

**:

#include#includeconst int maxn = 2000005;

int a[maxn], n, m;

struct nodes

;std::dequeq;

int main()

); printf("0\n");

for(int i = 2; i <= n; i++)

q.push_back((nodes));

} return 0;

}

P1440 求M區間內的最小值

乙個含有 nn 項的數列,求出每一項前的 mm 個數到它這個區間內的最小值。若前面的數不足 mm 項則從第 11 個數開始,若前面沒有數則輸出 00。第一行兩個整數,分別表示 nn,mm。第二行,nn 個正整數,為所給定的數列 a ia i nn 行,每行乙個整數,第 ii 個數為序列中 a ia ...

P1440 求m區間內的最小值

乙個含有n項的數列 n 2000000 求出每一項前的m個數到它這個區間內的最小值。若前面的數不足m項則從第1個數開始,若前面沒有數則輸出0。輸入格式 第一行兩個數n,m。第二行,n個正整數,為所給定的數列。輸出格式 n行,第i行的乙個數ai,為所求序列中第i個數前m個數的最小值。輸入樣例1 627...

P1440 求m區間內的最小值

小可愛的題面 這題跟那個滑動視窗很像啊,就是滑動視窗是只有多於m個數字才會輸出,而該題則是不足m個數就直接從1開始比對 本來還以為是個環。那麼這題還有要注意的一點就是這題的m個數字不包含自身,故最後乙個資料其實是沒用的,那麼就可以在最開始輸出個0,之後當成包含自身的情況,最後少處理乙個數,如下 in...