#include <bits/stdc++.h>
using namespace std;//用数组实现栈
int n, a[1000005], l[1000005], r[1000005], st[1000005]/*手写栈*/, s,cur;//O(N)
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++) {//遍历阶段
while (s > 0 && a[i] <= a[st[s - 1]]) {
cur= st[--s];//cur是当前弹出的索引
r[cur] = i;
l[cur] = s == 0 ? -1 : st[s - 1];
}
st[s++] = i;
}
while (s > 0) { //清算阶段
cur = st[--s];
r[cur] = -1;
l[cur] = s == 0 ? -1 : st[s - 1];
}
for (int i = n - 2; i >= 0; i--) { //修正阶段
if (r[i] != -1 && a[i] == a[r[i]]) {
r[i] = r[r[i]];
}
}
for (int i = 0; i < n; i++) {
printf("%d %d\n", l[i], r[i]);
}
}
【算法讲解052【必备】单调栈-上】 https://www.bilibili.com/video/BV1HH4y1X7T9/?share_source=copy_web&vd_source=5065fa61022691e8df35c771a30e6d29

京公网安备 11010502036488号