P5788 单调栈 - 模板
题目背景
模板题,无背景。
2019.12.12 更新数据,放宽时限,现在不再卡常了。
题目描述
给出项数为
定义函数
试求出
输入格式
第一行一个正整数
第二行
输出格式
一行
样例 #1
样例输入 #1
5
1 4 2 3 5
样例输出 #1
2 5 4 5 0
提示
【数据规模与约定】
对于
对于
对于
解答
cpp
#include <iostream>
#include <stack>
using namespace std;
const int N = 3e6 + 5;
int n, a[N], f[N];
stack<int> s;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
}
for (int i = n; i >= 1; i --) {
while (!s.empty() && a[s.top()] <= a[i]) {
s.pop(); // 保证当前数是栈中最小
}
f[i] = s.empty() ? 0 : s.top();
s.push(i);
}
for (int i = 1; i <= n; i ++) {
cout << f[i] << " ";
}
return 0;
}
数组模拟栈
cpp
#include <iostream>
using namespace std;
const int N = 3e6 + 5;
int n, a[N], stk[N], f[N];
int tt;
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
cin >> n;
for (int i = 1; i <= n; i ++) {
cin >> a[i];
}
for (int i = n; i >= 1; i --) {
while (tt > 0 && a[stk[tt]] <= a[i]) {
tt --;
}
f[i] = tt > 0 ? stk[tt] : 0;
stk[++ tt] = i;
}
for (int i = 1; i <= n; i ++) {
cout << f[i] << " ";
}
return 0;
}