【洛谷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 }