乙個含有n項的數列(n<=2000000),求出每一項前的m個數到它這個區間內的最小值。若前面的數不足m項則從第1個數開始,若前面沒有數則輸出0。
輸入格式:
第一行兩個數n,m。
第二行,n個正整數,為所給定的數列。
輸出格式:
n行,第i行的乙個數ai,為所求序列中第i個數前m個數的最小值。
輸入樣例1:
6278143
2
輸出樣例1:
077113
【資料規模】
m≤n≤2000000
ai<=3*107
思路:單調佇列,首先我們要明確一件事情,就是對於i與j來說,如果i<=j,那麼a[j]對單調佇列的貢獻一定比a[i]的貢獻大,也就是說,如果當a[i]與a[j]同時存在時,我們一定會選擇a[j]。那麼我們就可以保證在當前佇列中的元素一定是最優的,之後我們再維護一下每一項的時間即可。
**:
#include#include#include
#include
#include
using
namespace
std;
static
intn,m;
struct
mt;mt mt[
2000008
];deque
< mt >q;
long
long
read()
while(ch>='
0'&&ch<='9')
return x*f;
}int
main()
printf(
"0\n");
for(int i=1;ii)
return0;
}
P1440 求M區間內的最小值
乙個含有 nn 項的數列,求出每一項前的 mm 個數到它這個區間內的最小值。若前面的數不足 mm 項則從第 11 個數開始,若前面沒有數則輸出 00。第一行兩個整數,分別表示 nn,mm。第二行,nn 個正整數,為所給定的數列 a ia i nn 行,每行乙個整數,第 ii 個數為序列中 a ia ...
P1440 求m區間內的最小值
這道題就是經典的滑動視窗問題了。要求你求某乙個數的前 m 位中的最小元素。先說一句話 單調佇列中,隊首儲存的是最優解,其實是次解,以此類推。所以我們可以構造乙個上公升的單調佇列,隊首弄出來的就是答案。元素的加入不用說,就是那樣子。重點是這裡多了元素的刪除。因為視窗的長度有限,你需要把當前視窗沒有覆蓋...
P1440 求m區間內的最小值
小可愛的題面 這題跟那個滑動視窗很像啊,就是滑動視窗是只有多於m個數字才會輸出,而該題則是不足m個數就直接從1開始比對 本來還以為是個環。那麼這題還有要注意的一點就是這題的m個數字不包含自身,故最後乙個資料其實是沒用的,那麼就可以在最開始輸出個0,之後當成包含自身的情況,最後少處理乙個數,如下 in...