單調佇列實現與例題

2021-07-23 16:36:19 字數 1709 閱讀 2338

就是乙個符合單調性質的佇列,它同時具有單調的性質以及佇列的性質。他在程式設計中使用頻率不高,但卻占有至關重要的地位。它的作用很簡單,就是為了維護一組單調資料,讓我們在執行的過程中能夠快速尋求前k個或後k個中最大或最小的值。
單調佇列的核心就是佇列中的元素保持遞增或遞減

強行證明正確性:

假設在陣列 a 中存在某個數 x , 它在以它為中心, 長度為 2*k-1 的區間中是最大的, 也就是說, 往前 k-1 個數, 往後 k-1 個數, 都小於或等於 x;

例如: 2 3 4 5 2 3 4 (k=4)

當 push(x) 時

當 push(x) 時

與上一種情況類似

寫不下去了

裸題欣賞:

★☆ 輸入檔案:window.in 輸出檔案:window.out 簡單對比

時間限制:2 s 記憶體限制:256 mb

給你乙個長度為n的陣列,乙個長為k的滑動的窗體從最左移至最右端,你只能見到視窗的k個數,每次窗體向右移動一位,如下表:

window position

min value

max value

[1 3 -1] -3 5 3 6 7-13

1 [3 -1 -3] 5 3 6 7-33

1 3 [-1 -3 5]3 6 7-35

1 3 -1 [-3 5 3] 6 7-35

1 3 -1 -3 [5 3 6] 736

1 3 -1 -3 5 [3 6 7 ]37

你的任務是找出視窗在各位置時的 max value, min value.

第一行 n,k,第二行為長度為n的陣列

第一行每個位置的 min value, 第二行每個位置的 max value

8 3

1 3 -1 -3 5 3 6 7

-1 -3 -3 -3 3 3

3 3 5 5 6 7

20%:n≤500;

50%:n≤100000;

100%:n≤1000000;

兩個單調佇列,乙個計算最大,乙個計算最小

#include 

const

int n = 1000000+10;

struct p;

p max_que[n], min_que[n];

int max_head = 0, max_tail = 0, min_head = 0, min_tail = 0;

int a[n];

int n, k;

inline

void max_push(int x, int t);

}inline

void min_push(int x, int t);

}inline

int getint(int ret = 0, char c = getchar(), bool neg = 0)

inline

void putint(int x)

int main()

putchar('\n');

//重複上面的操作, 差別不大

for(int i = 0; i < k-1; i++)max_push(a[i], i);

for(int i = k-1; i < n; i++)

return

0; }

單調棧與單調佇列簡單例題

poj3250 題意 有n只奶牛排成一列向右看,每頭奶牛只能看到比自己矮的奶牛,即會被高的奶牛擋住後面,問共有多少只奶牛能被看到 思路 考慮每頭奶牛能被前面牛看到的次數,也就是從他左邊開始單調遞減的序列的長度,用單調棧維護即可 include includeusing namespace std c...

單調佇列模板 例題

單調佇列是指 佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作。單調佇列顧名思義就是乙個有規律的佇列,這個佇列的規律是 所有在佇列裡的數都必須按遞增 或遞減 的順序列隊。例如 有如下一串數字 1 5 3 4 2 首先第乙個數字1先進佇列,que 之後第二個...

單調佇列和單調棧例題

1 單調佇列 給出乙個長度為n的序列和區間長度k 從左向右對每乙個長度為k的區間詢問最大值和最小值。思路 對於最小值,考慮維護乙個遞增的雙端佇列,每次入隊時將隊尾比當前入隊元素的全部刪除,每次取隊首並且判斷是否在當前區間內即可 author hairu,wu from ahut include in...