(模板)单调栈
【模板】单调栈
题目描述
给出项数为 \(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;
}

浙公网安备 33010602011771号