bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)

1660: [Usaco2006 Nov]Bad Hair Day 乱发节

Time Limit: 2 Sec   Memory Limit: 64 MB
Submit: 881   Solved: 421
[ Submit][ Status][ Discuss]

Description

bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节(单调栈)_第1张图片

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。

Sample Output

5

3+0+1+0+1=5

HINT

Source

Silver

[ Submit][ Status][ Discuss]

题解:单调栈

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define N 100000
using namespace std;
int n,st[N],a[N],k[N];
long long ans;
int main()
{
	scanf("%d",&n);
	for (int i=1;i<=n;i++)
	 scanf("%d",&a[n-i+1]);
	int cnt=0;
	for (int i=1;i<=n;i++)
	 {
	 	int t=0;
	 	while (a[i]>a[st[cnt]]&&cnt)
	 	 k[i]+=k[st[cnt]]+1,cnt--;
	 	st[++cnt]=i;
	 }
	for (int i=1;i<=n;i++)
	 ans+=(long long)k[i];
	printf("%lld\n",ans);
}



你可能感兴趣的:(bzoj 1660: [Usaco2006 Nov]Bad Hair Day 乱发节(单调栈))