lgP5788 数组中寻找右侧第一个大于它的数

给定数组a[n],对于每个元素a[i],求后面第1个比它大的元素的下标,如果不存在,则用0表示。
1<=n<=3e6; 1<=a[i]<=1e9

单调栈和单调队列都是类似的套路,先循环把容器中不符合条件的元素弹出,然后更新答案,再将元素入队。

#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define per(i,a,b) for(int i=b;i>=a;i--)

const int N = 3000005;
int n, a[N], ans[N];
void solve() {
    cin >> n;
    rep(i,1,n) cin >> a[i];
    vector<int> s;
    per(i,1,n) {
        while (!s.empty() && a[i] >= a[s.back()])
            s.pop_back();
        ans[i] = s.empty() ? 0 : s.back();
        s.push_back(i);
    }
    rep(i,1,n) cout << ans[i] << " ";
}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    int t = 1;
    while (t--) solve();
    return 0;
}
posted @ 2024-03-17 00:33  chenfy27  阅读(15)  评论(0编辑  收藏  举报