【洛谷P2947】向右看齐

向右看齐

题目链接

此题可用单调栈O(n)求解

维护一个单调递减栈,元素从左到右入栈

若新加元素大于栈中元素,则栈中元素的仰望对象即为新加元素

每次将小于新加元素的栈中元素弹出,记录下答案

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 #define N 100010
 5 int n,w[N],stack[N],top,ans[N];
 6 int main()
 7 {
 8     scanf("%d",&n);
 9     for(int i=1;i<=n;i++)
10      scanf("%d",&w[i]);
11     w[0]=1000100;
12     for(int i=1;i<=n;i++){
13         while(w[stack[top]]<w[i]&&top>0){
14             ans[stack[top]]=i;
15             top--;
16         }
17         stack[++top]=i;
18     }
19     for(int i=1;i<=n;i++)
20      printf("%d\n",ans[i]);
21     return 0;
22 }

 

posted @ 2018-07-17 21:24  yjk  阅读(166)  评论(0编辑  收藏  举报