求m區間的最小值

2021-09-29 10:46:00 字數 1278 閱讀 7852

乙個含有n項的數列(n<=2000000),求出每一項前的m個數到它這個區間內的最小值。若前面的數不足m項則從第1個數開始,若前面沒有數則輸出0。

第一行兩個數n,m。

第二行,n個正整數,為所給定的數列。

n行,第i行的乙個數ai,為所求序列中第i個數前m個數的最小值。

6 27 8 1 4 3 207

7113

m ≤n

≤2000000

m≤n≤2000000

m≤n≤20

00000ai

≤3×1

07

a_i\leq 3\times 10^7

ai​≤3×

107單調佇列過一遍就出來了,

開乙個雙端佇列

對於每乙個數存下其下表,從1開始掃,

每次把數放到隊尾,同時如果隊尾比當前值大就讓隊尾出隊,直到小於等於當前數,

這樣從隊頭開始掃的時候數字下標和數值都是是遞增的。

然後我們對於下標大於i-m+1令其出隊

最後的隊頭就是當前下標時的答案

#include

#define ll long long

#define maxn 5000100

#define n 1001

#define inf 0x3f3f3f3f

#define gtc() getchar()

using

namespace std;

template

<

class

t>

inline

void

read

(t &s)

while

(isdigit

(ch)

) s *

= w;

}template

<

class

t>

inline

void

write

(t x)

int n, m;

struct nodea[maxn]

;deque q;

int qu[maxn]

;int

main()

qu[1]

=0;for

(int i =

1; i < n;

++i)

for(

int i =

0; i < n;

++i)

return0;

}

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

luogu P1440 求m區間內的最小值

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