fastle
垆边人似月 皓腕凝霜雪

题目描述

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

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

输入输出格式

输入格式:

 

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

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

 

输出格式:

 

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

/*基础的n-1对,然后用栈维护大小,保证大前小后,若不满足*/
/*把比当前数小的数弹出来,加上它们的数量*//*然而这是错的*/
/*正解也是栈,但是处理方式不同*/
/*当一个身高比栈顶高的人要进栈时,先将栈中所有身高比他矮的人弹掉*/
/*对于一样高的要特殊考虑,他们不会阻碍视线,因此弹出去后要再加上*/
#include<cstdio>
#include<algorithm>
#define maxn 500001
using namespace std;
int stack[maxn];
int top=0; 
int read()
{
    int now=0;
    int f=1;
    char c=getchar();
    while(c>'9'||c<'0')
    {
        if(c=='-')f=-1;
        c=getchar();
    }
    while(c>='0'&&c<='9')
    {
        now*=10;
        now+=c-'0';
        c=getchar();
    }
    return now*f;
}
int main()
{
    int n=read();
    int tot=0;
    for(int i=1;i<=n;i++)
    {
        int op=read();
        int co=1;
        while(op>stack[top]&&top>0)
        {
            top--;
            tot++;
        }
        while(op==stack[top]&&top>0)
        {
            top--;
            tot++;
            co++;
        }
        if(top!=0)tot++;
        top+=co;
        stack[top]=op;
    }
    printf("%d",tot);
    return 0;
}

 

posted on 2017-05-21 21:53  fastle  阅读(135)  评论(0编辑  收藏  举报