正题
评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2866
大意
一个 ci c i 是在他距离他后面第一个比他的 h h 大中间的间隔。求的和
解题思路
我们可以发现这道题肯定得把 ci c i 放在一起统计,我们可以开一个单调栈,每次压进去一个数,将小于它的都踢掉,栈中剩下数减一的就是一个 ci c i
代码
#include<cstdio>
#include<stack>
using namespace std;
stack<long long> p;
int n;
long long h[80200],s;
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
scanf("%d",&h[i]);//输入
for (int i=1;i<=n;i++)
{
while (!p.empty()&&h[p.top()]<=h[i]) p.pop();//维护单调队列
p.push(i);//压入
s+=p.size()-1;//计算答案
}
printf("%lld",s);
}