單調佇列在滑動最小值方面的應用

2021-07-27 23:23:44 字數 988 閱讀 2687

我們來看看,這樣乙個問題,poj 2823 sliding window

給定乙個序列 a1

,a2,

...,

ai,.

..,a

n 讓你構造乙個陣列b,

b[i]

=min

對於這個問題我們當然可以用rmq等資料結構在 o(

nlgn

) 的時間內解決,可是這個資料結構首先是太難寫了,二是複雜度還可以降低.

這種佇列滿足乙個關係及佇列中的元素滿足單調性,也就是說,qi

≤qi+

1(≥)

,進隊的時候對於當前元素如果隊尾元素 q.

tail

>ai

則q.t

ail出

隊 ,這樣對於

n 元素的序列由於每個元素最多出隊進隊一次,所以總的複雜度為o(

n)分攤下來就是 o(

1),

對於這個問題我們就可以使用這個資料結構來進行優化,每

k 個值取出 對首元素.

關於單調佇列的詳細介紹

具體細節如下

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

typedef

long

long ll;

const

int maxn = 1e6+10;

int n,k;

int a[maxn];

int deq1[maxn];

int deq2[maxn];

int mi[maxn],ma[maxn];

void solve()

}}int main()

滑動最小值

時間限制 1 sec 記憶體限制 128 mb 提交 127 解決 27 提交 狀態 討論版 命題人 admin 題目描述 給定乙個長度為 n 的數列 a0,a1,an 1和乙個整數k。求數列 bi min ai,ai 1 ai k 1 i 0,n 特別的,對於 i n k 的 bi 0。輸入第一行...

每k個數的最大最小值 (單調佇列)

有n個數,每次向右移動一位,每k個數輸出最大值最小值。題目鏈結 單調佇列,求最大值的時候佇列裡儲存下降序列的下標,求最小值的時候,儲存上公升序列的下標。每次輸出隊首。如果佇列裡的數的個數多於k個,就彈出隊首。pragma warning disable 4996 include include in...

單調佇列 滑動區間最值

已知乙個陣列,a 1 a n 共n項,問1 k,2 k 1 3 k 2 n k 1 n這些區間的最大值分別是多少?第1行2個數,n和k,含義如題中所述。1 k n 100000 接下來1行,有n個數,表示a陣列。a i 1000000 1行,共 n k 1 個數,表示每個區間的最大值。輸入 8 35...