链接
https://www.luogu.org/problemnew/show/P2866
题目大意
每个数的值定义为其后面比他小的数但没有被值更高的数阻挡的数量,求出所有的值和,简单写成
为第 个数后面比它小且没有被值更高的数阻挡的个数
解题思路
单调数据结构皆可,本蒟蒻用的是单调栈
但本题最快的做法是贪心,由于该算法并非本人想出,所以就不放代码了
代码
#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);
}