Title

(模板)单调栈

【模板】单调栈

题目描述

给出项数为 \(n\) 的整数数列 \(a_{1 \dots n}\)

定义函数 \(f(i)\) 代表数列中第 \(i\) 个元素之后第一个大于 \(a_i\) 的元素的下标,即 \(f(i)=\min_{i<j\leq n, a_j > a_i} \{j\}\)。若不存在,则 \(f(i)=0\)

试求出 \(f(1\dots n)\)

输入格式

第一行一个正整数 \(n\)

第二行 \(n\) 个正整数 \(a_{1\dots n}\)

输出格式

一行 \(n\) 个整数表示 \(f(1), f(2), \dots, f(n)\) 的值。

样例 #1

样例输入 #1

5
1 4 2 3 5

样例输出 #1

2 5 4 5 0

提示

【数据规模与约定】

对于 \(30\%\) 的数据,\(n\leq 100\)

对于 \(60\%\) 的数据,\(n\leq 5 \times 10^3\)

对于 \(100\%\) 的数据,\(1 \le n\leq 3\times 10^6\)\(1\leq a_i\leq 10^9\)

代码

#include <bits/stdc++.h>
#define endl '\n'
#define int long long
using lli = long long;
using ull = unsigned long long;
const int maxn = 3e6 + 6;
int nums[maxn];
int ans[maxn];
std::stack<int> stk;
std::stack<int> id;
void solve()
{
    int n = 0;
    std::cin >> n;
    for (int i = 1; i <= n; i++)
    {
        std::cin >> nums[i];
    }
    stk.push(nums[1]);
    id.push(1);
    for (int i = 2; i <= n; i++)
    {
        while(!stk.empty() && nums[i] > stk.top())
        {
            ans[id.top()] = i;
            stk.pop();
            id.pop();
        }
        stk.push(nums[i]);
        id.push(i);
    }
    for (int i = 1; i <= n; i++)
    {
        std::cout << ans[i] << ' ';
    }
}

signed main()
{
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr), std::cout.tie(nullptr);
    int t = 1;
    while(t--)
    {
        solve();
    }
    return 0;
}
posted @ 2024-09-23 19:43  栗悟饭与龟功気波  阅读(14)  评论(0)    收藏  举报