3250 - Bad Hair Day
时间限制: | 2000MS |
内存限制: | 65536K |
问题描述
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 6Cow#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 ofc1 through cN.For this example, the desired is answer 3 + 0 + 1 + 0 + 1 + 0 = 5.
输入说明
Line 1: The number of cows, N. Lines 2..N+1: Line i+1 contains a single integer that is the height of cow i.
输出说明
Line 1: A single integer that is the sum of c1 through cN.
输入样例
6 10 3 7 4 12 2
输出样例
5
来源
N/A
//首先奉上一种解法,本人制作,之后还有一种大神解法
#include <iostream>
using namespace std;
const int N=80005;
int h[N];
int num[N],maxx[N]; //num[i],第i个牛可以看见的头数目。 maxx[i],在第i头牛右边第一头比i高的牛序号
int main(){
int n,k;
unsigned long long ans = 0; //注意是 long long
while(cin>>n){
ans=0;
for(int i=0; i<n; i++){
cin>>h[i];
}
num[n-1]=0; maxx[n-1]=-1;
for(int i=n-2; i>=0; i--){
if(h[i]<h[i+1]){
num[i]=0; maxx[i]=i+1;
}
else{
k=i+1;
while(k!=-1 && h[k]<h[i]){
num[i]+=(num[k]+1);
k=maxx[k];
}
maxx[i]=k;
ans+=num[i];
}
}
cout<<ans<<endl;
}
return 0;
}
//接下来是完爆上面解法的大神解法
#include <stdio.h>
int a[80010], n, top;
int main() {
scanf("%d", &n);
long long ans = 0;
while (n --) {
int x; scanf("%d", &x);
while (top && a[top-1] <= x) top --; //a[]为递减数列,而且a[]中元素个数即为比当前牛高度高的左边牛数目
ans += top;
a[top++] = x;
}
printf("%lld\n", ans);
return 0;