1660: [Usaco2006 Nov]Bad Hair Day 乱发节
Time Limit: 2 Sec Memory Limit: 64 MBSubmit: 881 Solved: 421
[ Submit][ Status][ Discuss]
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
HINT
Source
题解:单调栈
#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);
}