給定長度為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]的值。
1view codeintn, k;
2int
a[maxn];34
intb[maxn];
5int
deq[maxn];67
void
solve() 19}
20}21for (int i = 0; i <= n - k; i++)
24 }
poj2823
用兩個雙端佇列維護
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7view code#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 }
單調佇列 入門
今天寫了人生中第乙個單調佇列,激動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 我們之前已經計...