[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
#include
#include
#include
#include
#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\n",ans);
    return 0;
}

你可能感兴趣的:(usaco)