P1823 [COI2007] Patrik 音乐会的等待
模型总结
单调栈
关键点
- 开longlong
- 注意对相同元素的处理,注意最劣复杂度要正确
- 使用二分进行统计和出栈
// from [hzwer](http://hzwer.com/445.html)
#include<cstring>
#include<cstdio>
using namespace std;
int st[500001],top=1,x;
int main()
{
int n;
int l,r,m;
cin>>n;
long long tot=0;
cin>>st[1];
for(int i=2;i<=n;i++){
scanf("%d",&x);
if(x<st[top]){
tot++;top++;st[top]=x;
}
else {
l=1;
r=top;
while (l<r){
m=(l+r)>>1;
if (r==l+1) m=r;
if (st[m]>x) l=m;
else r=m-1;
}
tot+=top-l+1;
while(top>0&&st[top]<x)top--;
st[++top]=x;
}
}
cout<<tot<<endl;
return 0;
}