P1823 [COI 2007] Patrik 音乐会的等待
题目描述
nnn 个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。
队列中任意两个人 aaa 和 bbb,如果他们是相邻或他们之间没有人比 aaa 或 bbb 高,那么他们是可以互相看得见的。
写一个程序计算出有多少对人可以互相看见。
输入格式
输入的第一行包含一个整数 nnn,表示队伍中共有 nnn 个人。
接下来的 nnn 行中,每行包含一个整数,表示人的高度,以毫微米(等于 10−910^{-9}10−9 米)为单位,这些高度分别表示队伍中人的身高。
输出格式
输出仅有一行,包含一个数 sss,表示队伍中共有 sss 对人可以互相看见。
输入输出样例 #1
输入 #1
7
2
4
1
2
2
5
1
输出 #1
10
说明/提示
数据规模与约定
对于全部的测试点,保证 1≤1\le1≤ 每个人的高度 <231< 2^{31}<231,1≤n≤5×1051 \le n \le 5\times 10^51≤n≤5×105。
C++实现
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <stack>
using namespace std;
typedef long long llint;
typedef pair<int,int> par;
stack<par> S;
int main( void ) {
int n;
scanf( "%d", &n );
llint ret = 0;
for( int i = 0; i < n; ++i ) {
int h;
scanf( "%d", &h );
par p( h, 1 );
for( ; !S.empty() && S.top().first <= h; S.pop() ) {
ret += S.top().second;
if( S.top().first == h ) p.second += S.top().second;
}
if( !S.empty() ) ++ret;
S.push( p );
}
cout << ret << endl;
return 0;
}

后续
接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容
328

被折叠的 条评论
为什么被折叠?



