问题描述
给定一个长度为 N 的序列 a。
第一行输出每个数字其左边第一个比其大的数字,不存在则输出 -1
。
第二行输出每个数字其右边第一个比其大的数字,不存在则输出 -1
。
第三行输出每个数字其左边第一个比其小的数字,不存在则输出 -1
。
第四行输出每个数字其右边第一个比其小的数字,不存在则输出 -1
。
输入格式
第一行输入一个正整数 N。(1≤N≤2×105)(1≤N≤2×105)
第二行输入 N 个正整数,表示序列 a。
输出格式
第一行输出每个数字其左边第一个比其大的数字,不存在则输出 -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 <bits/stdc++.h>
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<<d1[i]<<" ";
cout<<endl;
for(int i=1; i<=n; i++) cout<<d2[i]<<" ";
cout<<endl;
for(int i=1; i<=n; i++) cout<<d3[i]<<" ";
cout<<endl;
for(int i=1; i<=n; i++) cout<<d4[i]<<" ";
return 0;
}
/*
in:
5
4 3 2 1 5
out:
-1 4 3 2 -1
5 5 5 5 -1
-1 -1 -1 -1 1
3 2 1 -1 -1
*/
运行限制
语言 | 最大运行时间 | 最大运行内存 |
---|---|---|
C++ | 1s | 256M |
C | 1s | 256M |
Java | 2s | 256M |
Python3 | 3s | 256M |
PyPy3 | 3s | 256M |
Go | 3s | 256M |
JavaScript | 3s | 256M |