P2947

题目

题目描述:

约翰的 N(1N105)N(1\le N\le10^5) 头奶牛站成一排,奶牛 ii 的身高是 Hi(1Hi106)H_i(1\le H_i\le10^6)。现在,每只奶牛都在向右看。对于奶牛 ii,如果奶牛 jj 满足 i<ji<jHi<HjH_i<H_j,我们可以说奶牛 ii 可以仰望奶牛 jj。 求出每只奶牛离她最近的仰望对象。

输入格式:

11 行输入 NN,之后 NN 行第 i+1i+1 行输入一个身高 HiH_i

输出格式:

NN 行,按顺序每行输出一只奶牛的最近仰望对象,如果没有仰望对象,输出 00

数据范围与说明:

【输入说明】

66 头奶牛的身高分别为 33, 22, 66, 11, 11, 22

【输出说明】

奶牛 1,21,2 仰望奶牛 33,奶牛 4,54,5 仰望奶牛 66,奶牛 3366 没有仰望对象。

【数据规模】

对于 20%20\% 的数据:1N101\le N\le10

对于 50%50\% 的数据:1N1031\le N\le10^3

对于 100%100\% 的数据:1N105,1Hi1061\le N\le10^5,1\le H_i\le10^6

输入输出样例 #1

输入:

1
2
3
4
5
6
7
6 
3
2
6
1
1
2

输出:

1
2
3
4
5
6
3 
3
0
6
6
0

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include<bits/stdc++.h>
using namespace std;
int h[100001],ans[100001];
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&h[i]);
}
stack<int> st;
for(int i=n;i>=1;i--){
while(!st.empty()&&h[st.top()]<=h[i]){
st.pop();
}
if(st.empty()){
ans[i]=0;
}else{
ans[i]=st.top();
}
st.push(i);
}
for(int i=1;i<=n;i++){
printf("%d\n",ans[i]);
}
return 0;
}