單調佇列入門

2022-09-17 08:39:12 字數 1301 閱讀 7217

給定長度為n的數列a和整數k,求b[i] = min, 複雜度為o(n)

最開始單調隊列為空,保證佇列中的元素始終保持單調性

為了計算b[0],把0到k-1依次加入佇列。在加入i時,當單調佇列的末尾的值j滿足a[j] >= a[i],則不斷取出。直到雙端隊列為空或者a[j] < a[i]之後再於末尾加入i。

等到k-1加入佇列,檢視頭部的值j,b[0] = a[j]。如果j = 0, 由於在之後的計算的中都不會用到了,因此從雙端佇列的頭部刪去。

接下裡,為了計算b[i],需要在雙端佇列的末尾加入k。不斷加入元素,就可以算出後面的b[i]的值。

1

intn, k;

2int

a[maxn];34

intb[maxn];

5int

deq[maxn];67

void

solve() 19}

20}21for (int i = 0; i <= n - k; i++)

24 }

view code

poj2823

用兩個雙端佇列維護

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

#define inf 0x3f3f3f3f

8#define mod 1000000007

9 typedef long

long

ll;10

using

namespace

std;

1112

const

int maxn = 1e6 + 10;13

14int

n, len;

1516

inta[maxn];

1718

intb[maxn];

19int

deq[maxn];

2021

void

getmin() 31}

32}3334

for (int i = 0; i <= n - len; i++) 37}

3839

void

getmax() 49}

50}5152

for (int i = 0; i <= n - len; i++) 55}

5657

intmain()

62getmin();

63getmax();

64return0;

65 }

view code

單調佇列 入門

今天寫了人生中第乙個單調佇列,激動ing 先看一道單調佇列的入門題 乙個含有n項的數列 n 2000000 求出每一項前面的第m個數到它這個區間內的最小值。先寫出動規方程 f i min j合法 很明顯的,這是乙個n 2的動規,但是,我們可以注意到,數列中有些數無論如何都不會被選到.如 1 2 8 ...

單調佇列入門

單調佇列是一種佇列 廢話 其中佇列的元素保證是單調遞增或者是單調遞減的 那麼隊首的元素不就是最小 或最大 的嗎?我們結合具體的題目來看看吧 傳送門 p1886 滑動視窗 現在有一堆數字共n個數字 n 10 6 以及乙個大小為k 的視窗。現在這個從左邊開始向右滑動,每次滑動乙個單 位,求出每次滑動後視...

單調佇列入門

單調佇列這個名字就指明了它的性質 單調性,是乙個單調的雙端佇列 下面列出deque的常用成員函式 來自 單調佇列入門題目 p1886 滑動視窗 模板 單調佇列 這裡我們只討論最大值,最小值原理一樣的 很明顯,當我們在計算區間 i k 1,i 的最大值時,是不是區間 i k 1,i 1 我們之前已經計...