zoukankan      html  css  js  c++  java
  • luoguP1823 [COI2007] Patrik 音乐会的等待

    题目描述

    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 }
    View Code
  • 相关阅读:
    ES6 generator生成器
    ES6 Class类(简单理解封装和继承)
    谷歌(chrome)浏览器下载文件另存为其它地址
    ES6 中的解构数组和对象
    获取数组中某一个元素的下标
    删除数组对象中某一个指定的对象
    jquery复选框全选功能
    正则获取字符串中的数字
    js刷新当前页面,刷新父页面
    找出最长序列的长度
  • 原文地址:https://www.cnblogs.com/Larry-Zero/p/11732502.html
Copyright © 2011-2022 走看看