码迷,mamicode.com
首页 > 其他好文 > 详细

【刷题】【单调栈】音乐会的等待

时间:2019-10-23 22:00:35      阅读:94      评论:0      收藏:0      [点我收藏+]

标签:const   ret   else   span   单调栈   pre   cst   重点   排队   

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\n",ans);
    return 0;
} 

 

【刷题】【单调栈】音乐会的等待

标签:const   ret   else   span   单调栈   pre   cst   重点   排队   

原文地址:https://www.cnblogs.com/xwww666666/p/11729048.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!