POJ3250[USACO2006Nov]Bad Hair Day[单调栈]
Time Limit: 2000MS | Memory Limit: 65536K | |
Total Submissions: 17774 | Accepted: 6000 |
Description
Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads.
Each cow i has a specified height hi (1 ≤ hi ≤ 1,000,000,000) and is standing in a line of cows all facing east (to the right in our diagrams). Therefore, cow i can see the tops of the heads of cows in front of her (namely cows i+1, i+2, and so on), for as long as these cows are strictly shorter than cow i.
Consider this example:
=
= =
= - = Cows facing right -->
= = =
= - = = =
= = = = = =
1 2 3 4 5 6
Cow#1 can see the hairstyle of cows #2, 3, 4
Cow#2 can see no cow's hairstyle
Cow#3 can see the hairstyle of cow #4
Cow#4 can see no cow's hairstyle
Cow#5 can see the hairstyle of cow 6
Cow#6 can see no cows at all!
Let ci denote the number of cows whose hairstyle is visible from cow i; please compute the sum of c1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.
Input
Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.
Output
Sample Input
6 10 3 7 4 12 2
Sample Output
5
Source
题意:求每个点右面能看到的个数的总和
超级水的单调栈
// // main.cpp // poj3250 // // Created by Candy on 10/6/16. // Copyright © 2016 Candy. All rights reserved. // #include <iostream> #include <cstdio> #include <algorithm> #include <cstring> using namespace std; typedef long long ll; const int N=8e4+5; inline int read(){ char c=getchar();int x=0,f=1; while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();} while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();} return x*f; } int n,a[N]; ll ans=0; struct data{ int h,c; }st[N]; int top=0; int main(int argc, const char * argv[]) { n=read(); for(int i=n;i>=1;i--) a[i]=read(); for(int i=1;i<=n;i++){ data x; x.h=a[i]; x.c=0; while(top&&st[top].h<x.h){ x.c+=st[top].c+1; top--; } st[++top]=x; ans+=x.c; //printf("%d %d\n",i,x.c); } printf("%lld",ans); return 0; }