单调栈&单调队列

· · 算法·理论

单调栈

一.定义及概述

1.定义:

单调栈是一种内部元素具有单调性的栈。

1.概述:

利用出栈进栈的特性(入栈放最后,出栈出最后)来维护栈的单调性,利用该优化算法可以将 O(n^2) 的时间复杂的问题转化为 O(n) 。

1.适用场景

#include<bits/stdc++.h>
using namespace std;
int n;
long long ans=0;
stack<int>st;
stack<int>sum;
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        long long h;
        scanf("%lld",&h);
        while(!st.empty()&&h>=st.top()){
            ans+=(i-sum.top()+1);
            st.pop();
            sum.pop();
        }
        if(!st.empty()) ans+=(i-sum.top()+1);
        st.push(h);
        sum.push(i);
    }
    printf("%lld",ans);
}

单调队列

1.定义:

单调栈是一种内部元素具有单调性的队列。

1.概述:

利用队列双端的特性(可出头可出尾)来维护队列的单调性,利用该优化算法可以将 O(n^2) 的时间复杂的问题转化为 O(n) 。

1.适用场景