[USACO06NOV]糟糕的一天Bad Hair Day(洛谷P2866)

[USACO06NOV]糟糕的一天Bad Hair Day

题目描述
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.

题意翻译
在这里插入图片描述
输入格式

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.

输入 #1

6
10
3
7
4
12
2

输出 #1

5

一道单调栈经典题目;如果直接暴力,超时;单调栈的具体操作用数组模拟,基本思想是维护一个单调递减的栈,当要加入一个元素时,找到比它大的数的位置,插进去;这道题要算的就是每次插入一个数时,有多少个数比它大;
代码:

#include
using namespace std;
int sta[100000],a[100000];
int main(){int n;scanf("%d",&n);for(int i=1;i<=n;i++) scanf("%d",&a[i]);long long sum=0;int ans=0;//栈的当前位置 for(int i=1;i<=n;i++){while(ans&&a[i]>=sta[ans]){ans--;//找到栈中比a[i]小的数,找不到a[i]则为栈底 }sum+=ans;//ans为栈中有多少个数比a[i]大,同时ans+1也是a[i]的位置;sta[++ans]=a[i]; }printf("%lld\n",sum);
}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部