[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<bits/stdc++.h>
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);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值