洛谷 P1440 求m區間內的最小值 單調佇列

2022-02-13 14:04:19 字數 1084 閱讀 6222

顯然是一道單調佇列題目……

對於單調佇列不明白的請看這一篇部落格:

這道題和模板唯一的不同點就是從0開始,一直輸出n次。什麼意思呢?

詳細點說,就是輸出0到0,0到1,0到2……一直到0到m-1,接著是1到m,2到m+1,3到m+2……一直到n-m到n-1的最小值。

具體可以研究一下樣例,很容易就可以理解。

所以我們只需要在輸出上做一點修改。

如果隊列為空,說明這是第乙個元素,就輸出0到0之間的最小值,顯然是0。

否則就每次在讀入乙個數之前,就輸出單調佇列裡面的最小值。

而且我們發現,最後讀入的數其實是沒有用的!!坑啊

首先是tle:

找了好長時間的bug,沒想到竟然是cin cout 搞的!!盤他

然後是莫名re:

原來當m==1時,少判斷了乙個q.empty()會爆掉。。。

無語。。。。。

1 #include2 #include3 #include4

using

namespace

std;

5int

n,m;

6struct num//

建構函式 9};

10 dequeq; //

定義乙個雙端佇列,注意標頭檔案

11void makeq(int i,int

in)23

}24 q.push_back(num(i,in

));25}26

}27intmain()

36return0;

37 }

洛谷P1440 求m區間內的最小值

題目大意 給你n個數,求出每個數前m位的最小值 題解 單調佇列,用乙個可以雙向彈出的佇列來存一串數,滿足裡面的數具有單調性,我們可以假設它是單調遞增的,即求最小的數。那麼可以把要插入的這個數與隊尾元素比較,如果隊尾的數大,那麼插入它就不滿足單調性了,那麼我們就從隊尾刪除元素,直到比隊尾元素大。這樣就...

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...