lanqiaoOJ:19871 单调栈

【题目描述】
给定一个长度为 N 的序列 a。
第一行输出每个数字其左边第一个比其大的数字,不存在则输出 -1。
第二行输出每个数字其右边第一个比其大的数字,不存在则输出 -1。
第三行输出每个数字其左边第一个比其小的数字,不存在则输出 -1。
第四行输出每个数字其右边第一个比其小的数字,不存在则输出 -1。
update:本题数据于2025-01-13加强至2×10^5,以杜绝暴力通过。

【输入格式】
第一行输入一个正整数 N。(1≤N≤2×10^5)
第二行输入 N 个正整数,表示序列 a。(1≤ai≤10^5, 1≤i≤ N)

【输出格式】
第一行输出每个数字其左边第一个比其大的数字,不存在则输出 -1。
第二行输出每个数字其右边第一个比其大的数字,不存在则输出 -1。
第三行输出每个数字其左边第一个比其小的数字,不存在则输出 -1。
第四行输出每个数字其右边第一个比其小的数字,不存在则输出 -1。​​​​​​​

【输入样例】
5
4 3 2 1 5​​​​​​​

【输出样例】
-1 4 3 2 -1
5 5 5 5 -1
-1 -1 -1 -1 1
3 2 1 -1 -1​​​​​​​

#include 
using namespace std;
 
const int maxn=2e5+5;
int d1[maxn],d2[maxn],d3[maxn],d4[maxn];
int stk[maxn],a[maxn];
int n,top;
 
int main() {
    cin>>n;
    for(int i=1; i<=n; i++) cin>>a[i];
 
    top=0;
    for(int i=1; i<=n; i++) {
        while(top && a[stk[top]]<=a[i]) top--;
        if(top) d1[i]=a[stk[top]];
        else d1[i]=-1;
        stk[++top]=i;
    }
 
    top=0;
    for(int i=n; i>=1; i--) {
        while(top && a[stk[top]]<=a[i]) top--;
        if(top) d2[i]=a[stk[top]];
        else d2[i]=-1;
        stk[++top]=i;
    }
 
    top=0;
    for(int i=1; i<=n; i++) {
        while(top && a[stk[top]]>=a[i]) top--;
        if(top) d3[i]=a[stk[top]];
        else d3[i]=-1;
        stk[++top]=i;
    }
 
    top=0;
    for(int i=n; i>=1; i--) {
        while(top && a[stk[top]]>=a[i]) top--;
        if(top) d4[i]=a[stk[top]];
        else d4[i]=-1;
        stk[++top]=i;
    }
 
    for(int i=1; i<=n; i++) cout<

你可能感兴趣的:(算法,数据结构)