題目大意:給你n個數,求出每個數前m位的最小值
題解:單調佇列,用乙個可以雙向彈出的佇列來存一串數,滿足裡面的數具有單調性,我們可以假設它是單調遞增的,即求最小的數。那麼可以把要插入的這個數與隊尾元素比較,如果隊尾的數大,那麼插入它就不滿足單調性了,那麼我們就從隊尾刪除元素,直到比隊尾元素大。這樣就可以滿足要求。如果隊首元素已經超出了m的範圍,就從隊首刪除元素,隊首的元素就一直是答案。
#includeusing namespace std;int n,m;
int q[2001000],h,t;
int s[2001000];
int main()
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 位中的最小元素。先說一句話 單調佇列中,隊首儲存的是最優解,其實是次解,以此類推。所以我們可以構造乙個上公升的單調佇列,隊首弄出來的就是答案。元素的加入不用說,就是那樣子。重點是這裡多了元素的刪除。因為視窗的長度有限,你需要把當前視窗沒有覆蓋...