[单调栈]排队
排 队 排队 排队
题目描述
n个人排成一条直线(一排),给出队伍中每个人的身高,每个人只能看到站在他右边且个头比他小没有被其他人挡住(跟他身高相同也会挡出他)的人。请求出所有人可以看到的人数之和。
1<=N<=80,000
样例输入
6
5
10
3
7
4
12
2
样例输出
5
数据范围
50% 1≤N≤10000
100% 1≤N≤100000
1<=p<=q<=n
code
#include<stdio.h>
#include<iostream>
using namespace std;
long long n,a[80005],h[8005],et=1,ans=0;
int main(){
scanf("%lld",&n);
for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
a[n+1]=999999999;h[et]=n+1;
for(int i=n;i>0;--i){
while((a[h[et]]<a[i]) and et>0)et--;
ans+=h[et]-i-1;
h[++et]=i;
}
printf("%lld\n",ans);
return 0;
}