分析
题意:问序列中右边第一个比他大的数比他靠后几个位置。
从后往前做,维护单调递增的队列。
因为如果一个数又小又靠后,这个数没有用。
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<stack>
using namespace std;
stack<int> st;
int n,t[30001],ans[30001];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>t[i];
}
for(int i=n;i>=1;i--)
{
while(!st.empty()&&t[st.top()]<=t[i]) st.pop();
if(!st.empty()) ans[i]=st.top()-i;
else ans[i]=0;
st.push(i);
}
for(int i=1;i<=n;i++)
{
cout<<ans[i]<<' ';
}
return 0;
}