当前位置: 代码迷 >> 综合 >> 【SSL 2882】[POJ 3250]排队【单调栈模板】
  详细解决方案

【SSL 2882】[POJ 3250]排队【单调栈模板】

热度:98   发布时间:2024-02-09 19:27:31.0

排队

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