单调栈,感觉是一个很灵活的东西,算个辅助降低复杂度的东西吧
最关键还是,单调栈的性质,里面的数据是单调递增递减,这其实就是满足很多有关单调性的其他的性质了
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int s[500009],top=0,n,k;
int main()
{
scanf("%d",&n);
int ans=0;
scanf("%d",&s[1]);top=1;
for (int i=2;i<=n;i++)
{
scanf("%d",&k);
if (s[top]>k)
{
ans++;
s[++top]=k;
}
else
{
int l=1,r=top;
while (l<r)
{
int mid=(l+r)>>1;
if (l+1==r) mid=r;
if (s[mid]>k) l=mid;
else r=mid-1;
}
ans+=top-l+1;
while (s[top]<k&&top>0) top--;
s[++top]=k;
}
}
printf("%d",ans);
return 0;
}