题目描述
N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。
写一个程序计算出有多少对人可以互相看见。
输入格式
输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。
接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。
输出格式
输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。
输入输出样例
输入
7 2 4 1 2 2 5 1
输出
10
解题思路
单调栈
AC Code
1 #include<stack> 2 #include<iostream> 3 #include<cstdio> 4 #include<cstring> 5 #include<algorithm> 6 using namespace std; 7 #define ll long long 8 stack<pair<int,int> > S; 9 int main(){ 10 int n; 11 scanf("%d",&n); 12 ll cnt=0; 13 for(int i=1;i<=n;i++){ 14 int k; 15 scanf("%d",&k); 16 pair<int,int> p(k,1); 17 for(;!S.empty()&&S.top().first<=k;S.pop()){ 18 cnt+=S.top().second; 19 if(S.top().first==k)p.second+=S.top().second; 20 } 21 if(!S.empty())++cnt; 22 S.push(p); 23 } 24 return cout<<cnt,0; 25 }