首页 > 代码库 > POJ3250[USACO2006Nov]Bad Hair Day[单调栈]
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
610374122
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;}
POJ3250[USACO2006Nov]Bad Hair Day[单调栈]