1660: [Usaco2006 Nov]Bad Hair Day 乱发节
Description
Input
* Line 1: 牛的数量 N。
* Lines 2..N+1: 第 i+1 是一个整数,表示第i头牛的高度。
Output
* Line 1: 一个整数表示c[1] 至 c[N]的和。
Sample Input
6
10
3
7
4
12
2
输入解释:
六头牛排成一排,高度依次是 10, 3, 7, 4, 12, 2。
10
3
7
4
12
2
输入解释:
六头牛排成一排,高度依次是 10, 3, 7, 4, 12, 2。
Sample Output
5
3+0+1+0+1=5
3+0+1+0+1=5
麻麻再也不用担心我不会写单调栈了,用栈记录当前点距第一个大于等于它的数,注意是大于等于,
还要把n+1设置成无穷大。。。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<algorithm> 5 #include<cstring> 6 #define MAX 80010 7 #define ll long long 8 #define inf 6000000000 9 using namespace std; 10 ll f[MAX];int sta[MAX],b[MAX],top=0; 11 int main(){ 12 int n; 13 scanf("%d",&n); 14 for(int i=1;i<=n;i++)scanf("%lld",&f[i]); 15 f[n+1]=inf; 16 for(int i=1;i<=n+1;i++){ 17 while(top>0&&f[sta[top]]<=f[i]){b[sta[top]]=i-sta[top]-1;top--;} 18 sta[++top]=i; 19 } 20 ll ans=0; 21 for(int i=1;i<=n;i++)ans+=b[i]; 22 printf("%lld",ans); 23 }