洛谷 P1823 [COI2007] Patrik 音乐会的等待(栈)

题目描述

N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。

写一个程序计算出有多少对人可以互相看见。

输入输出格式

输入格式:

 

输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。

接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。

 

输出格式:

 

输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。

 

输入输出样例

输入样例#1: 复制

7 
2 
4 
1 
2 
2 
5 
1

输出样例#1: 复制

10

解题思路

 对于每一对人,能互相看见的前提是,他们中间没有比他们两个中任何一个高的人。我们让每个人按照顺序入栈,在入栈前,先查看栈顶的人是不是比自己高,如果栈顶的人比自己矮,那么自己可以看到栈顶的人,和它的前一个人,但是对于栈顶的人来说,自己比他高就把自己后面的人都挡住了,他已经不能再看到后面的人了,所以让他出栈。直到栈顶是第一个比自己高的人,也就是自己往前看所能看到的最后一个人。

但是呢,人的高度可以相同,且一样的高度的人是不会互相挡住的。难道要把一样的全出栈直到找到第一个大的再全入栈么?时间就不行了,所以可以用结构体存这个高度,和这个高度在栈中的连续数。这样只要出一次,进一次就可以了。

代码如下

#include <iostream>
#include <stack>
#include <cstdio>
using namespace std;
typedef long long ll;
struct T{
	int x;
	ll cnt;
};
stack<T> sta;
int main()
{
	int n;
	cin >> n;
	ll ans = 0;
	for(int i = 1; i <= n; i ++){
		int high;
		scanf("%d", &high);
		T temp;   
		temp.x = high;
		temp.cnt = 1;
		while(!sta.empty()){
			T top = sta.top();	
			if(top.x > high){  
				ans ++;   //可以看到比自己高的第一个人 
				break;
			}
			else {
				ans += top.cnt;
				sta.pop();
				if(top.x  == high)       //高度相同 
					temp.cnt += top.cnt; //则把这些数量加到要入栈的节点中去 
			}			
		}
		sta.push(temp);
	}
	cout << ans << endl;
	return 0;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: rsq,是一种统计量,用于衡量变量之间的相关性程度。rsq取值范围为0到1,越接近1则说明变量之间的相关性越强。 period,指时间周期。在时间序列分析中,period用来描述数据中波动重复的时间间隔,如一个月、一季度、一年等。 scale,表示尺度或比例。在数据分析中,scale用于描述不同数据的比例关系,并可用于对数据进行同比分析。 coi,是小波分析中的一个术语,用于描述不同尺度的小波系数之间的交错情况。COI越小,则说明小波分析的结果越可靠和精确。 sig95,表示显著性水平为95%。当sig95小于等于0.05时,说明两个变量之间的差异具有统计学显著性,即这两个变量之间的差异不是由于随机变化所致,而是由于真实的原因所致。 ### 回答2: rsq、period、scale、coi、sig95都是与时频分析相关的术语。 rsq是指相关系数,用于衡量变量之间的线性相关程度,通常取值在0到1之间,越接近1则相关程度越高。 period是指周期,是一种重复的模式或运动,它可以是时间、空间等方面的。在时频分析中,周期用于描述信号重复出现的间隔时间。 scale是指尺度,用于描述信号的空间或频率范围。在时频分析中,尺度通常与小波分析相关。 coi是指不确定性区间,是一种用于描述信号分析结果的不确定性的方法,它与信号的尺度和频率有关。 sig95是指显著性水平,指的是信号的某些特征是否达到了统计学上的显著性水平。通常,sig95取值在0到1之间,越接近1,则表明信号的特征越显著。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值