单调栈

题目:

AcWing 830. 单调栈:https://www.acwing.com/problem/content/832/
单调栈 + 并查集:
AcWing 1275. 最大数:https://www.acwing.com/problem/content/1277/
B:https://codeforces.com/gym/105158


解决问题:
单调栈可以得到一个数左边或右边第一个≥(>)或≤(<)它的下标
可以开一个v[i]数组储存每一个数的下一个下标,类似可以使用并查集find()查找


模板:

// AcWing 830. 单调栈
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
int arr[N], v[N], sta[N];
// 栈顶 sta[cnt]
// 入栈 sta[++ cnt] = input;
// 出栈 output = sta[cnt --];
// 栈是否为空 if !cnt <=> if sta.empty()
int cnt = 0;
int main()
{
    int n;
    cin >> n;
    for(int i = 1; i <= n; ++ i)
        scanf("%d",&arr[i]);
    for(int i = n; i >= 1; -- i)
    {
        if(!cnt || arr[i] >= arr[sta[cnt]])
            sta[++ cnt] = i;
        else
        {
            while(cnt && arr[i] < arr[sta[cnt]])
                v[sta[cnt --]] = arr[i];
            sta[++ cnt] = i;
        }
    }
    while(cnt)
        v[sta[cnt --]] = -1;
    for(int i = 1; i <= n; ++ i)
        printf("%d ",v[i]);
    return 0;
}
posted @ 2024-09-10 17:41  Frodnx  阅读(18)  评论(0)    收藏  举报