對於單調佇列的基本概念可以去看百科裡的相關介紹:
這裡挑一些重點。
作用:不斷地向快取陣列裡讀入元素,也不時地去掉最老的元素,不定期的詢問當前快取陣列裡的最小的元素。
最直接的方法:普通佇列實現快取陣列。
進隊出隊都是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指隊首,...