排队
Description
n个人排成一条直线(一排),给出队伍中每个人的身高,每个人只能看到站在他右边且个头比他小没有被其他人挡住(跟他身高相同也会挡出他)的人。请求出所有人可以看到的人数之和。
1<=N<=80,000
Sample Input
6
5
10
3
7
4
12
2
Sample Output
5
解题思路
这题就是单挑栈
所谓单调栈,也就是和单调队列差不多,也有单调递增和单调递减
单调递增栈:从栈顶到栈底的元素是严格递增
单调递减栈:从栈顶到栈底的元素是严格递减
但是单调栈只能从栈顶进出,不能从栈底进出
单调栈
AC代码
#include<iostream>
using namespace std;
long long n,o,s,a[80005],f[80005];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];//输入
f[++o]=n+1;//初值
a[n+1]=2147483647;
for(int i=n;i>=1;i--)
{
while(a[f[o]]<a[i]&&o>=1)o--;//如果当前数比后面的数要大,后面的数是没有贡献的,直接弹掉
s+=f[o]-i-1;//此时栈顶的数是右边第一个大于等于a[i]的数,那么中间的数都比a[i]小,统计进答案
f[++o]=i;//插入栈中
}
cout<<s;
}