單調棧與單調佇列

2022-06-08 17:57:14 字數 1448 閱讀 8233

單調棧

單調棧就是棧內元素保持單調性的棧

遍歷整個序列,每一次從棧頂彈出會破壞單調性的元素,最後將當前元素加入棧頂

由於每個元素最多入棧一次,出棧一次,所以可以在\(o(n)\)的時間複雜度內處理資料

相關題目:hdu1506 largest rectangle in a histogram

#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define pii pair#define pll pair#define pi acos(-1.0)

#define eps 1e-6

#define lowbit(x) x&(-x)

using namespace std;

const int maxn=100010;

int n,h[maxn],l[maxn],r[maxn],stk[maxn];

void solve()

t=0;

for(int i=n-1;i>=0;i--)

ll ans=0;

for(int i=0;i單調佇列

單調佇列就是隊內元素保持單調性的佇列

單調佇列可以維護固定長度的區間的最值

遍歷整個序列,每一次從隊尾刪除會破壞單調性的元素,從隊頭刪除「過期」的元素,最後將當前元素加入隊尾

由於每個元素最多入隊一次,出隊一次,所以可以在\(o(n)\)的時間複雜度內完成資料處理

相關題目:hdu3415 max sum of max-k-sub-sequence

#include#include#include#include#include#include#include#include#include#include#include#include#include#define ll long long

#define pii pair#define pll pair#define pi acos(-1.0)

#define eps 1e-6

#define lowbit(x) x&(-x)

using namespace std;

int t,n,k,a[100010],sum[200010],deq[200010];

int main(void)

for(int i=n+1;ii-deq[s])

while(ssum[i])

deq[t++]=i;

}if(st>n) st-=n;

if(ed>n) ed-=n;

printf("%d %d %d\n",ans,st,ed);

}return 0;

}

單調佇列與單調棧

單調棧 單調棧,顧名思義,就是維持單調性 遞增或者遞減 的棧結構,如果新入棧的元素破壞了單調性,就彈出原先棧內元素,直到能夠滿足單調性 用途 它可以很方便地求出某個數的左邊或者右邊第乙個比它大或者小的元素,而且總時間複雜度o n 並且單調棧本身並不難實現 維護 每次入棧前先檢驗入棧後是否會破壞棧的單...

單調佇列與單調棧

線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...

單調佇列與單調棧

線段樹等等容易tle,我們需要乙個o n 的演算法來解決這個問題。思路 可以看出,這個視窗是可以用乙個雙向佇列來模擬的,每當後方加入乙個數,都要從佇列尾部開始淘汰掉所有的小於它的數,保證佇列中每乙個數的後面,在視窗範圍內沒有大於等於它的數。當隊首元素不在視窗範圍時,隊首元素出隊。這樣操作後,隊內的元...