acwing 600. 仰视奶牛

题目地址  https://www.acwing.com/problem/content/description/602/

约翰有N头奶牛,编号为1到N。

现在这N头奶牛按编号从小到大的顺序站成了一排,其中奶牛 i 的身高为HiHi。

现在,每头奶牛都向它的右侧望向那些编号较大的奶牛,对于奶牛 i 如果存在一头奶牛 j 满足 i<ji<j 并且 Hi<HjHi<Hj,那么我们称奶牛 i 需要仰视奶牛 j。

请你求出每头奶牛的最近仰视对象。

输入格式

第一行包含整数N。

接下来N行,每行包含一个整数HiHi,其中第 i 行的数为编号为 i 的奶牛的高度。

输出格式

共 N 行,每行输出一个整数,其中第 i 行的输出整数表示编号为 i 的奶牛的最近仰视对象的编号,如果不存在仰视对象,则输出0。

数据范围

1N1e5
1Hi1e6

 

输入样例:
6 
3 
2 
6 
1 
1 
2 
输出样例:
3 
3 
0 
6 
6 
0 

 

 

单调栈记录最近的未仰视的牛编号(有仰视的答案已经记录了 出栈)

 1 #include <iostream>
 2 #include <vector>
 3 #include <stack>
 4 
 5 
 6 using namespace std;
 7 
 8 const int N = 1e5+100;
 9 
10 vector<int> arr(N,0);
11 vector<int> ans(N,0);
12 stack<int> st;
13 int n ;
14 
15 int main()
16 {
17     cin >> n;
18     for(int i =1;i<= n;i++){
19         cin >> arr[i];
20     }
21     
22     for(int i =1;i <= n;i++){
23         while(!st.empty() && arr[i]>arr[st.top()]){
24             ans[st.top()] = i;
25             st.pop();
26         }
27         
28         st.push(i);
29     }
30     
31     while(!st.empty()){
32          ans[st.top()] = 0;
33          st.pop();
34     }
35     
36     for(int i = 1 ;i<=n;i++){
37         cout << ans[i] << endl;
38     }
39     
40     
41     return 0;
42 }
View Code

 

posted on 2019-05-24 22:25  itdef  阅读(216)  评论(0编辑  收藏  举报

导航