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。
数据范围
1≤N≤1e5
1≤Hi≤1e6
输入样例: 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 }
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力