刷题单调栈音乐会的等待

Posted xwww666666

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了刷题单调栈音乐会的等待相关的知识,希望对你有一定的参考价值。

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

 

以上是关于刷题单调栈音乐会的等待的主要内容,如果未能解决你的问题,请参考以下文章

音乐会的等待-单调栈

音乐会的等待-单调栈(进阶版)

[COI2007] [luogu P1823] Patrik 音乐会的等待 解题报告 (单调栈)

音乐会的等待-题解

刷题方法:单调栈

刷题总结——玉蟾宫(bzoj3039单调栈)