单调栈的作用:用于查找某一个位置往前的第一个小于当前位置数的数。
原理:根据暴力做法我们可以将a[i]前的所有数放在一个栈中,每次只需从栈顶遍历找到第一个小于a[i]的数即可。我们可以发现如果a[j1]>=a[j2]&&j1<j2,那么a[j1]这类的逆序对我们可以删掉下标较小的,在删除所有的逆序后,我们会发现栈变成了一个单调栈。
`
include[HTML_REMOVED]
using namespace std;
const int N=1e5+20;
int s[N],tt;
int main()
{
int n;
cin>>n;
for(int i=0; i[HTML_REMOVED]>x;
while(tt&&s[tt]>=x) tt–;
if(tt) cout<<s[tt]<<” “;
else cout<<”-1”<<” “;
s[++tt]=x;
}
}
`