[Usaco2006 Nov]Bad Hair Day 乱发节

Description
农民John的某 N 头奶牛 (1 <= N <= 80,000) 正在过乱头发节!由于每头牛都意识到自己凌乱不堪的发型,FJ 希望统计出能够看到其他牛的头发的牛的数量。
每一头牛 i有一个高度 h[i] (1 <= h[i] <= 1,000,000,000)而且面向同一方向排成一排。第i头牛可以看到第i+1,i+2头牛,只要他们的高度严格小于第i头牛,并且中间没有其他奶牛阻挡

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


跑一遍单调栈即可

#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define inf 0x7f7f7f7f
using namespace std;
typedef long long ll;
typedef unsigned int ui;
typedef unsigned long long ull;
inline int read(){
	int x=0,f=1;char ch=getchar();
	for (;ch<'0'||ch>'9';ch=getchar())	if (ch=='-')    f=-1;
	for (;ch>='0'&&ch<='9';ch=getchar())	x=(x<<1)+(x<<3)+ch-'0';
	return x*f;
}
inline void print(int x){
	if (x>=10)     print(x/10);
	putchar(x%10+'0');
}
const int N=8e5;
int stack[N+10];
int main(){
	int n=read(),top=0;
	ll ans=0;
	for (int i=1;i<=n;i++){
		int x=read();
		while (top&&x>=stack[top])	top--;
		ans+=top,stack[++top]=x;
	}
	printf("%lld
",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/Wolfycz/p/8413601.html