【单调数据结构,贪心】Day 12 提高组模拟C组 T1 乱头发节 Bad Hair Day

链接

https://www.luogu.org/problemnew/show/P2866

题目大意

每个数的值定义为其后面比他小的数但没有被值更高的数阻挡的数量,求出所有的值和,简单写成

A n s = i = 1 n f [ i ]

f [ i ] 为第 i 个数后面比它小且没有被值更高的数阻挡的个数

解题思路

单调数据结构皆可,本蒟蒻用的是单调栈
但本题最快的做法是贪心,由于该算法并非本人想出,所以就不放代码了

代码

#include<cstdio>
#include<stack>
#define re register
#define getchar() (S==T&&(T=(S=BB)+fread(BB,1,1<<15,stdin),S==T)?EOF:*S++)
using namespace std;int a[80001],n,f;
long long ans;
char c;
stack<int>q;
char BB[1<<15],*S=BB,*T=BB;
inline int read() 
{
    f=0;
    while(c=getchar(),c<=47||c>=59);f=(f<<3)+(f<<1)+c-48;
    while(c=getchar(),c>=48&&c<=57) f=(f<<3)+(f<<1)+c-48;
    return f;
}
signed main()
{
    freopen("badhair.in","r",stdin);
    freopen("badhair.out","w",stdout);
    n=read();
    for(re int i=0;i<n;i++)
    {
        a[i]=read();
        while(q.size()&&a[i]>=a[q.top()]) q.pop();//维护栈内单调性
        q.push(i);
        ans+=q.size()-1;
    }
    printf("%lld",ans);
}

猜你喜欢

转载自blog.csdn.net/xuxiayang/article/details/81087132