排队 题解

排队 题解

排队

题目

n n n个人排成一条直线(一排),给出队伍中每个人的身高,每个人只能看到站在他右边且个头比他小没有被其他人挡住(跟他身高相同也会挡出他)的人。请求出所有人可以看到的人数之和。
1<= N N N<=80,000

样例

input
6
10
3
7
4
12
2

output
5


解题思路

单调栈
单调维护一个递增或递减的序列(与单调队列不一样,只能由一头出栈)

如果当前的比栈顶的小
就使栈顶出栈
栈顶的编号减当前的编号就是能看到的人数
最终答案累加


代码

#include
#include
using namespace std;
long long n,x,t=0,ans,a[80020],num[80020],q[80020];
int main()
{
	scanf("%lld",&n);
	for (int i=1;i<=n;i++)
	    scanf("%lld",&a[i]);
	num[++t]=n+1; 
	a[n+1]=0x7f7f7f7f;  //赋一个极大数,建墙
	for (int i=n;i>0;i--)
	{
		while (a[num[t]]<a[i]&&t>0) t--;  //栈顶比当前小,出栈
		ans+=num[t]-i-1;  //累加答案
		num[++t]=i;  //入栈,保存编号
	}
	cout<<ans<<endl;
	return 0; 
}

你可能感兴趣的:(单调栈)