音乐会的等待-题解

查看原题请戳这里

感觉这道题用单调栈做这一点还是很容易看出来的。

然后我们就会发现其实现在问题变得非常的简单。

每次读入一个数,就找到第一个比它小的数并进行替换,然后将前面的数全部删掉就可以了,处理每一个数的时候都要更新一下答案。
附一下代码:

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long  n,top;
long long Ans;
int a[500050],stk[500050];
void dfs(int x)
{
    int le=0,ri=top,mid,ret=0;
    while(le<=ri)
    {
        mid=(le+ri)>>1;
        if(a[stk[mid]]>x)ret=mid,le=mid+1;
        else ri=mid-1;
    }
    if(!ret)Ans+=top;
    else Ans+=top-ret+1;
}
int main()
{
    scanf("%d",&n);
    for(int i=1; i<=n; ++i)scanf("%d",&a[i]);
    for(int i=1; i<=n; ++i)
    {
        dfs(a[i]);
        while(top>0&&a[i]>a[stk[top]])--top;
        stk[++top]=i;
    }
    printf("%lld",Ans);
    return 0;
}

原文地址:https://www.cnblogs.com/wflight/p/10503546.html

时间: 2024-10-31 17:49:04

音乐会的等待-题解的相关文章

洛谷 P1823 音乐会的等待 题解

此文为博主原创题解,转载时请通知博主,并把原文链接放在正文醒目位置. 题目链接:https://www.luogu.org/problem/show?pid=1823 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 输入输出格式 输入格式: 输入的第一行包含一个整数N (1 ≤ N ≤ 500 000),

洛谷P1823 音乐会的等待 单调栈

洛谷P1823 音乐会的等待 单调栈 维护一个上升的单调栈 用以记录有当前这个数向后能看到几个数 但是每次加入一个数 时 他能看到的 是 单调栈中所有比他小的 和跟他一样的数 比他小的下次就没有用了,所以直接退栈 但是 相同的数到后面还是可能会有贡献的,所以贡献算完以后又要进栈 最后如果栈中还有元素,那么栈顶一定能看到自身,所以+1 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 #defin

音乐会的等待-单调栈

关于本题,这里只是基础的写法,完美的避开了特殊情况,另一篇博文会详细讲解特殊情况 [COI2007] Patrik 音乐会的等待 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 输入输出格式 输入格式: 输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人. 接下来的N行

P1823 音乐会的等待

题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 输入输出格式 输入格式: 输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人. 接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米.这些高度分别表示队伍

洛谷——P1823 音乐会的等待

https://www.luogu.org/problem/show?pid=1823 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 输入输出格式 输入格式: 输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人. 接下来的N行中,每行包含一个整数,表示人的高度,以毫微

洛谷 P1823 音乐会的等待

题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 输入输出格式 输入格式: 输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人. 接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米.这些高度分别表示队伍

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

这道题的基础做法在上一篇博文中已经提到了,详情请见:https://www.cnblogs.com/yufenglin/p/10306366.html 而在课上有人提到了一种简便做法(错的,但可以改对),先来回顾一下题目: 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 输入输出格式 输入格式: 输入的第

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

N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没有人比A或B高,那么他们是可以互相看得见的. 写一个程序计算出有多少对人可以互相看见. 重点: (1)看题要仔细 (2)不开long long 见祖宗 解法神奇 #include<cstdio> #include<cstdlib> #include<stack> #define ll long long using namesp

大神刷题表

9月27日 后缀数组:[wikioi3160]最长公共子串 dp:NOIP2001统计单词个数 后缀自动机:[spoj1812]Longest Common Substring II [wikioi3160]最长公共子串 [spoj7258]Lexicographical Substring Search 扫描线+set:[poj2932]Coneology 扫描线+set+树上删边游戏:[FJOI2013]圆形游戏 结论:[bzoj3706][FJ2014集训]反色刷 最小环:[poj1734