[单调栈]排队

排 队 排队


题目描述

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;
}

posted @ 2020-08-13 09:18  unknown_future  阅读(127)  评论(0编辑  收藏  举报