首页 > 其他 > 详细

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

时间:2019-10-23 22:30:27      阅读:95      评论:0      收藏:0      [点我收藏+]

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;
} 

 

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!