题目:
题解:用一个单调递增的栈,每次记录更大的值,然后碰到一个比栈顶元素小的元素则从栈尾lower_bound查找,每次记录每个位置的答案
类似题目:Codeforces-91B
代码:
#include<bits/stdc++.h>
#define N 1000006
using namespace std;
int n,tail;
int a[N],num[N],pos[N],ans[N];
int main()
{
while(~scanf("%d",&n))
{
tail=1;
for(int i=1;i<=n;i++)scanf("%d",&a[i9]);
for(int i=n;i>=1;i--)
{
if(tail-1==0||a[i]>num[tail-1])
{
num[tail]=a[i];
pos[tail++]=i;
ans[i]=0;
}
else if(a[i]==num[tail-1])ans[i]=0;
else if(a[i]<num[tail-1])
{
int k=upper_bound(num+1,num+tail,a[i])-num;
ans[i]=pos[k]-i;
}
}
for(int i=1;i<=n;i++)
printf("%d%c",ans[i],i==n?'\n':' ');
}
return 0;
}