问题描述
给出项数为 的整数数列 。
定义函数 代表数列中第 个元素之后第一个大于 的元素的下标,即 。若不存在,则 。
试求出 。
输入格式
第一行一个正整数 。
第二行 个正整数 。
输出格式
一行 个整数 的值。
样例
输入
5
1 4 2 3 5
输出
2 5 4 5 0
数据范围
对于 的数据,;
对于 的数据, ;
对于 的数据,,。
解决方案
思路
单调栈
代码
#include <iostream>
#include <stack>
using namespace std;
const int N = 3e6 + 5;
int n;
int arr[N];
int result[N];
int main() {
cin >> n;
for (int i = 1; i <= n; ++i) {
cin >> arr[i];
}
stack<int> s;
for (int i = n; i >= 1; --i) {
while (!s.empty() && arr[i] >= arr[s.top()])
s.pop();
if (s.empty())
result[i] = 0;
else
result[i] = s.top();
s.push(i);
}
for (int i = 1; i <= n; ++i) {
cout << result[i] << " ";
}
return 0;
}