解题思路
维护一个单调递增的单调栈,即从栈顶到栈低是单调递增的。若新加入的大于栈顶,则从栈顶弹出那些小于新加入的,那些被弹出的的“后面第一个大于”就是这个新加入的数。最后不要忘记加入。
代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,a[30010],ans[30010],st[30010],t;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
for(int i=1;i<=n;i++)
{
if(t==0)
st[++t]=i;
else
{
while(a[i]>a[st[t]]&&t){
ans[st[t]]=i-st[t];
t--;
}
st[++t]=i;
}
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
}