排队
Time Limit:10000MS Memory Limit:65536K
Case Time Limit:1000MS
Description
n个人排成一条直线(一排),给出队伍中每个人的身高,每个人只能看到站在他右边且个头比他小没有被其他人挡住(跟他身高相同也会挡出他)的人。请求出所有人可以看到的人数之和。
1<=N<=80,000
Sample Input
6
10
3
7
4
12
2
Sample Output
5
分析:
这道题其实就是单调栈的模板题
CODE:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
long long n,ans,a[100005],st[100005],top=1;
int main(){scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);a[n+1]=0x7fffffff; //右边界不会超过nst[1]=n+1;for(int i=n;i>0;i--){while(a[st[top]]<a[i]&&top) top--; //出栈ans+=st[top]-i-1; //中间数统计st[++top]=i; //入栈}printf("%lld",ans);return 0;
}