• 洛谷P1823 音乐会的等待


    P1823 音乐会的等待

    题目描述

    N个人正在排队进入一个音乐会。人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人。队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的。

    写一个程序计算出有多少对人可以互相看见。

    输入输出格式

    输入格式:

    输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。

    接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。

    输出格式:

    输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。

    输入输出样例

    输入样例#1:
    7 
    2 
    4 
    1 
    2 
    2 
    5 
    1
    输出样例#1:
    10

    说明

    数据制作: @w

    很“简单”的单调栈。洛谷标签跟我说要用线段树,我差点就信了。

    维护一个单调递增(或相等)的单调栈,不难看出只需要在栈中统计对数即可。因为把整个栈形成的数列中插入一些值能恢复成原数列,而插入的值一定比两边的值都要小,

    不可能跟新加入的元素相互看得到。

    因此,对于新加入单调栈的一个元素,我们分三种情况讨论:

    1、新元素num比stack[top]小:直接加入栈,只能与栈首配对,ans加一

    2、新元素num与stack[top]相等:可以与栈首所有相等元素配对,ans加栈中与栈首元素相等的数的个数,同时ans还应再加一,因为num还能与栈中第一个比Num大的数配对

    3、新元素num比stack[top]大:不断弹出元素,每弹一个ans加一,一直弹到num <= stack[top],同2理进行判断即可。

    一定要分析严密,看了几遍题解,想了好多遍才想全。。

    #include <bits/stdc++.h>
    const int INF = 0x3f3f3f3f;
    const int MAXN = 500000 + 10;
    inline void read(int &x){
        x = 0;char ch = getchar();char c = ch;
        while(ch > '9' || ch < '0')c = ch, ch = getchar();
        while(ch <= '9' && ch >= '0')x = x * 10 + ch - '0',ch = getchar();
        if(c == '-') x = -x;
    }
    
    int n,num[MAXN];
    int top,stack[MAXN]; 
    long long ans;
    
    int main(){
        read(n);
        for(int i = 1;i <= n;i ++)
        {
            read(num[i]);
        }
        stack[0] = INF;
        stack[++top] = num[1];
        for(int i = 2;i <= n;i ++)
        {
            if(stack[top] > num[i])
            {
                ans ++;
            }
            else if(stack[top] == num[i])
            {
                int j = top;
                while(stack[j] == num[i])ans ++,j --;
                if(j != 0)ans ++;
            }
            else
            {
                while(stack[top] < num[i])top--,ans++;
                int j = top;
                while(stack[j] == num[i])ans ++,j --;
                if(j != 0)ans ++;
            }
            stack[++top] = num[i];
        }
        printf("%d", ans);
        return 0;
    }
  • 相关阅读:
    f clk hclk pclk
    人必须有强大的精神
    删除数据 DataIntegrityViolationException: notnull property references a null or transient value解决
    网页的!DOCTYPE声明及对网页起何作用(转)
    eclipse spket jquery 插件 错误 loading context has encountered a problem
    【引用】mysql编码设置
    Java中抽象类和接口的区别 经典(转)
    MyEclipse 修改 默认的 工作空间(转)
    Spring启动异常: cvcelt.1: Cannot find the declaration of element 'beans'(转)
    seru ftp 上传 文件 出现如下 错误 200 227 501
  • 原文地址:https://www.cnblogs.com/huibixiaoxing/p/6973821.html
Copyright © 2020-2023  润新知