音乐会的等待(诺诺的队列)
来源:http://218.5.5.242:9018/JudgeOnline/problem.php?id=1308
题目描述
  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
代码
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #include<iostream> #include<cstring> #include<cstdio> using namespace std; int st[500001],top=1,x; int main() {     int n;     int l,r,m;     cin>>n;     long long tot=0;     cin>>st[1];     for(int i=2;i<=n;i++){       scanf("%d",&x);       if(x<st[top]){         tot++;top++;st[top]=x;       }       else { 	    l=1;         r=top;         while (l<r){           m=(l+r)>>1;           if (r==l+1)  m=r;           if (st[m]>x) l=m;           else r=m-1;         }         tot+=top-l+1;         while(top>0&&st[top]<x)top--;         st[++top]=x;       }    }     cout<<tot<<endl;     return 0; } | 
                                  Subscribe  
                            
                                                                        
                    