• 音乐会的等待-单调栈


    关于本题,这里只是基础的写法,完美的避开了特殊情况,另一篇博文会详细讲解特殊情况

    [COI2007] Patrik 音乐会的等待

    题目描述

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

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

    输入输出格式

    输入格式:

    输入的第一行包含一个整数N (1 ≤ N ≤ 500 000), 表示队伍中共有N个人。

    接下来的N行中,每行包含一个整数,表示人的高度,以毫微米(等于10的-9次方米)为单位,每个人的调度都小于2^31毫微米。这些高度分别表示队伍中人的身高。

    输出格式:

    输出仅有一行,包含一个数S,表示队伍中共有S对人可以互相看见。

    输入输出样例

    输入样例#1: 
    7 
    2 
    4 
    1 
    2 
    2 
    5 
    1
    输出样例#1: 
     10
     
    说句实话,这道题真的挺坑的,首先,我们先来说一下大体的思路。
    这道题其实就是给出一个队伍,要找出所有能相互看见的一对(两个人之间没有比两个人任意一个人高的人),那么我们该怎么做呢?
    我们来想一下,由于题中让我们找的是对数,为了避免找重了,我们只能看一个方向(如果你偏要看两个方向再除以二也没有人拦你。。。),但是从左往右看显然前面元素会受到后面的影响,为了保证正序判断,这里应该从右往左看。
    我们任意取一位人,那么这个人所能看到最远的人就是它前面第一个比他高的人,并且如果这个人高于他左边的人P,那么显然他右边的人一定看不到P。
    根据这两条性质,我们很容易想到一种数据结构:栈。又因为每个人入栈时栈中元素一定是单调不递增的,所以该栈具有单调性,因此我们引入一个新的概念:单调栈。
    归概来说,每当我们放入一个元素,我们只需要执行两个操作:
    1.查找第一个比他高的人,统计看到的人数
    2.弹出会被他遮到(小于他)的元素
    第一条我们可以用二分法查找,而第二条直接线性搜索即可。
    最后,附上本题代码:
     1 #include<cstdio>
     2 using namespace std;
     3 int n,top;
     4 long long Ans;
     5 int a[500050],stk[500050];
     6 void dfs(int x)
     7 {
     8     int le=0,ri=top,mid,ret=0;
     9     while(le<=ri)
    10     {
    11         mid=(le+ri)>>1;
    12         if(a[stk[mid]]>x)ret=mid,le=mid+1;
    13         else ri=mid-1;
    14     }
    15     if(!ret)Ans+=top;
    16     else Ans+=top-ret+1;
    17 }
    18 int main()
    19 {
    20     scanf("%d",&n);
    21     for(int i=1; i<=n; ++i)scanf("%d",&a[i]);
    22     for(int i=1; i<=n; ++i)
    23     {
    24         dfs(a[i]);
    25         while(top>0&&a[i]>a[stk[top]])--top;
    26         stk[++top]=i;
    27     }
    28     printf("%lld",Ans);
    29     return 0;
    30 }
  • 相关阅读:
    在T-SQL语句中访问远程数据库(openrowset/opendatasource/openquery)
    sqlserver 编辑、修改字段说明(备注) sp_addextendedproperty
    mssqlserver修改表名,列名,添加表列,删除表列,修改表列类型
    C#语法中的select
    SET IDENTITY_INSERT的用法,具体去体验一下
    亲爱的mssql码农们,看看利用sp_addlinkedserver实现远程数据库链接
    Web.config配置文件详解
    jquery分页展示控件:kkpager
    C#给图片加水印,可设置透明度
    C#图片水印类
  • 原文地址:https://www.cnblogs.com/yufenglin/p/10306366.html
Copyright © 2020-2023  润新知