ACM 單調佇列

2022-09-17 23:45:28 字數 1535 閱讀 4578

對於單調佇列的基本概念可以去看百科裡的相關介紹:

這裡挑一些重點。

作用:不斷地向快取陣列裡讀入元素,也不時地去掉最老的元素,不定期的詢問當前快取陣列裡的最小的元素。

最直接的方法:普通佇列實現快取陣列。

進隊出隊都是o(1),一次查詢需要遍歷當前佇列的所有元素,故o(n)。

rmq即range maximum(minimum) query,用來求某個區間內的最大值或最小值。使用線段樹或稀疏表是o(log(n))級的。對於這類問題這兩種方法也搞得定,但是沒有單調佇列快。

定位:大多數題目為單調佇列力所不能及的,取而代之的是單調佇列基礎上改進的斜率優化,單調棧等,因為其限制條件,故潛力不大。但需要掌握,因為有許多演算法建立在其基礎上。

簡單說就是基礎,得會。

poj 2823

k大小的滑動視窗,求每次視窗中最大值和最小值

思路:維護單增佇列和單減佇列,因為滑動視窗和index有關,所以加個index陣列維護head的索引

#include #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define mem(a,b) memset(a,b,sizeof(a))

#define pf printf

#define sf scanf

#define spf sprintf

#define pb push_back

#define debug printf("!\n")

#define maxn 1000000+5

#define max(a,b) a>b?a:b

#define blank pf("\n")

#define ll long long

#define all(x) x.begin(),x.end()

#define ins(x) inserter(x,x.begin())

#define pqueue priority_queue

#define inf 0x3f3f3f3f

#define ls (rt<<1)

#define rs (rt<<1|1)

intn,m,k;

inta[maxn],qu[maxn],index[maxn],ans[maxn];

void

getmin()

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

}void

getmax()

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

}int

main()

return0;

}

acm 單調佇列

單調佇列 佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作。操作 1 插入 若新元素從隊尾插入後會破壞單調性,則刪除隊尾元素,直到插入後不再破壞單調性為止,再將其插入單調佇列。2 獲取最優 最大 最小 值 訪問首尾元素。原理 在處理時,去掉不和諧的狀態,使...

ACM單調佇列學習小結

單調佇列 解釋為 佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作。單調佇列的常用操作如下 1 插入 若新元素從隊尾插入後會破壞單調性,則刪除隊尾元素,直到插入後不再破壞單調性為止,再將其插入單調佇列。2 獲取最優 最大 最小 值 訪問首尾元素。一組數 1...

acm第十六次單調佇列

單調佇列一 單調佇列 佇列中元素之間的關係具有單調性,而且,隊首和隊尾都可以進行出隊操作,只有隊尾可以進行入隊操作 二 單調佇列的常用操作如下 插入 若新元素從隊尾插入後會破壞單調性,則刪除原來的隊尾元素,直到插入後不再破壞單調性為止,再將其插入單調佇列。一般用倆個指標指位置,front 0指隊首,...