zoukankan      html  css  js  c++  java
  • 【刷题】【单调栈】音乐会的等待

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

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

    重点:

    (1)看题要仔细

    (2)不开long long 见祖宗

    解法神奇

    #include<cstdio>
    #include<cstdlib>
    #include<stack>
    #define ll long long 
    using namespace std;
    int n;
    const int N=500003;
    int x,tt; ll ans;
    
    struct node
    {
        int v;ll sum;
    }d[N];
    stack <node> s;
    
    int main()
    {
        scanf("%d",&n);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&x);
            if(x==d[tt].v ) d[tt].sum ++;
            else d[++tt].v =x,d[tt].sum =1;
        }
        
        for(int i=1;i<=tt;i++)
        {
            ll cnt=0,res=0;
            while(!s.empty() && s.top() .v < d[i].v ) //还是有可能在删除了一些结构体之后,还有相等的元素 
                cnt+=s.top().sum , s.pop() ;
            if(!s.empty() && s.top().v==d[i].v ) 
                res =s.top().sum , s.pop() ;
            if(!s.empty() ) 
                cnt+=d[i].sum ;
            
            ans+=cnt + res*d[i].sum + d[i].sum *(d[i].sum -1) /2 ;
            s.push((node){d[i].v ,res+d[i].sum }); 
        }
        printf("%lld
    ",ans);
        return 0;
    } 
  • 相关阅读:
    如何编译完全使用静态库的可执行文件
    交叉编译jpeglib遇到的问题
    安装SDL遇到的问题
    软链接/硬链接删除事项
    alias命令使用
    Linux下学习摄像头使用
    018 字符串类型及操作
    017 示例3-天天向上的力量
    016 数字类型及操作
    015 基本数据类型
  • 原文地址:https://www.cnblogs.com/xwww666666/p/11729048.html
Copyright © 2011-2022 走看看