jzoj1264,P2866-乱头发节,糟糕的一天Bad Hair Day【单调栈】

正题

评测记录:https://www.luogu.org/recordnew/lists?uid=52918&pid=P2866


大意

一个 c i 是在他距离他后面第一个比他的 h 大中间的间隔。求 c i 的和


解题思路

我们可以发现这道题肯定得把 c i 放在一起统计,我们可以开一个单调栈,每次压进去一个数,将小于它的都踢掉,栈中剩下数减一的就是一个 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);
}

猜你喜欢

转载自blog.csdn.net/mr_wuyongcong/article/details/81078910
今日推荐