P2866 [USACO06NOV] Bad Hair Day S

原题链接

题解

1.倒序求
2.求每个点有多少高度比自己
3.高度函数图像是有升有降的,由于要求比自己小的,在求完之后,我们把所有点前比自己小的点缩起来放到自己身上,然后把那些点删掉,再插入自己
这样序列就变成了降序,遍历的时候也只需要遍历那些降序点

code

#include<bits/stdc++.h>
#define ll long long
using namespace std;
struct node
{
    ll index,hide;
};
ll h[80008];
int main()
{
    ll n;
    cin>>n;
    for(ll i=1;i<=n;i++)
    {
        cin>>h[i];
    }

    stack<node> q;
    ll ans=0;
    for(ll i=n;i>=1;i--)
    {
        ll cnt=0;
        while(q.size()&&h[q.top().index]<h[i])
        {
            cnt+=q.top().hide+1;
            q.pop();
        }
        ans+=cnt;
        q.push({i,cnt});
    }

    cout<<ans;
    return 0;
}

posted @ 2024-03-10 15:01  纯粹的  阅读(75)  评论(0)    收藏  举报