题目描述![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/1dc96c57d37287782fbdc96ca6d04325.png)
思路:
题目相当于就是让你找i后第一个大于它的数
我们从后往做,维护单调栈,如果一个数比栈尾的数大,就把尾踢出,这样每次找到的第一个大于它的数就是i最小的
c o d e code code
#include<iostream>
#include<cstdio>
using namespace std;
int n, ans[1010100];
int a[1001000], v[1001000];
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
int tl=0;
for(int i=n; i>=1; i--)
{
while(a[i]>=a[v[tl]]&&tl>0)
tl--;
if(tl==0)
ans[i]=0;
else ans[i]=v[tl];
v[++tl]=i;
}
for(int i=1; i<=n; i++)
printf("%d ", max(0, ans[i]-i));
return 0;
}