PTA 7-1 单调栈

题目

N人们排队等着参加音乐会。人们等得很无聊,于是他们转身去排队寻找熟悉的人。
如果两个人A和B并排站在一起,或者如果他们中间没有人比A或B高,那么他们可以看到对方。

编写一个程序,确定可以看到彼此的成对人数。

输入格式:

第一行输入包含一个整数N(1≤N≤500000),排队的人数。

以下N行中的每一行都包含一个整数,即一个人的身高(以纳米为单位)。

每个人的身高都将小于231纳米。高度是按照人们排队的顺序给出的。

输出格式:

输出可以看到对方的成对人数

  • 输入样例:
7
2
4
1
2
2
5
1
  • 输出样例:
10

代码

#include
using namespace std;
int st[500010],n,top=1,m;
typedef long long LL;
LL ans;
int main()
{
    cin>>n;
    int a;
    cin>>st[1];
    for(int i=2;i<=n;i++)
    {
        cin>>a;
        if(st[top]>a)
        {
            top++,ans++,st[top]=a;
        }
        else
        {
            int l=1,r=top;
            while(l<r)
            {
                m=(l+r)>>1;
                if(r==l+1)m=r;
                if(a>=st[m])r=m-1;
                else l=m;
            }
            ans+=top-l+1;
            while(top>0&&st[top]<a)top--;
            st[++top]=a;
        }
    }
    cout<<ans;
}

分析

这道题考察单调栈。如果一个人后有人比他高,就直接剔除。每次加入的人身高比上个人矮,答案+1,比上一个人高,则找到比新加入的人高的人,然后剔除所有比新加入人矮的人即可。

你可能感兴趣的:(java算法实录,算法,数据结构)