百亿富翁
题目描述
这天小明买彩票中了百亿奖金,兴奋的他决定买下蓝桥公司旁的一排连续的楼房。
已知这排楼房一共有 NN 栋,编号分别为1∼N,第 ii 栋的高度为h i 。
好奇的小明想知道对于每栋楼,左边第一个比它高的楼房是哪个,右边第一个比它高的楼房是哪个(若不存在则输出 -1)。但由于楼房数量太多,小明无法用肉眼直接得到答案,于是他花了 1 个亿来请你帮他解决问题,你不会拒绝的对吧?
输入描述
第 1 行输入一个整数 N.表示楼房的数量。
第 2 行输入 N 个整数(相邻整数用空格隔开),分别为 h_1,h_2,…,h_N,表示楼房的高度。
1 <= N <= 7 x 10 ^ 5, 1 <= hi <= 10 ^ 9
输出描述
输出共两行。
第一行输出 N 个整数,表示每栋楼左边第一栋比自己高的楼的编号。
第二行输出 N 个整数,表示每栋楼右边第一栋比自己高的楼的编号。
输入输出样例
示例 1
输入
5
3 1 2 5 4
输出
-1 1 1 -1 4
4 3 4 -1 -1
AC代码
#include<bits/stdc++.h>
using namespace std;
const int N = 3e6 + 10;
stack<int>st;
int n , a[N] , l[N] , r[N];
int main()
{
cin >> n;
for(int i = 1 ; i <= n ; i ++) cin >> a[i];
for(int i = 1 ; i <= n ; i ++)
{
while(st.size() && a[st.top()] <= a[i]) st.pop();
if(st.size()) l[i] = st.top();
else l[i] = -1;
st.push(i);
}
while(!st.empty()) st.pop();
for(int i = n ; i >= 1 ; i --)
{
while(st.size() && a[st.top()] <= a[i]) st.pop();
if(st.size()) r[i] = st.top();
else r[i] = -1;
st.push(i);
}
for(int i = 1 ; i <= n ; i ++) cout << l[i] << " \n"[i == n];
for(int i = 1 ; i <= n ; i ++) cout << r[i] << " \n"[i == n];
return 0;
}