洛谷 P1823 音乐会的等待
题目描述
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
说明
数据制作: @w
首先有基础的n-1对 再用单调栈维护 一个不升序列 弹出一个数 ans就加1
然而只有0分
正解也是栈 ,只是不同的处理
因此,对于新加入单调栈的一个元素,我们分三种情况讨论:
1、新元素num比stack[top]小:直接加入栈,只能与栈首配对,ans加一
2、新元素num与stack[top]相等:可以与栈首所有相等元素配对,ans加栈中与栈首元素相等的数的个数,同时ans还应再加一,因为num还能与栈中第一个比Num大的数配对
3、新元素num比stack[top]大:不断弹出元素,每弹一个ans加一,一直弹到num <= stack[top],同2理进行判断即可。
1 #include <ctype.h> 2 #include <cstdio> 3 4 const int MAXN=500010; 5 6 int n,top,ans,x; 7 8 int stack[MAXN]; 9 10 inline void read(int&x) { 11 register char c=getchar(); 12 for(x=0;!isdigit(c);c=getchar()); 13 for(;isdigit(c);x=x*10+c-48,c=getchar()); 14 } 15 16 int hh() { 17 read(n); 18 for(int i=1;i<=n;++i) { 19 read(x); 20 int t=0; 21 while(top&&stack[top]<x) --top,++ans; 22 while(x==stack[top]&&top) --top,++ans,++t; 23 if(top) ++ans; 24 top+=t; 25 stack[++top]=x; 26 } 27 printf("%d\n",ans); 28 return 0; 29 } 30 31 int sb=hh(); 32 int main() {;}
作者:乌鸦坐飞机
出处:http://www.cnblogs.com/whistle13326/
新的风暴已经出现
怎么能够停止不前
穿越时空 竭尽全力
我会来到你身边
微笑面对危险
梦想成真不会遥远
鼓起勇气 坚定向前
奇迹一定会出现