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;
}
                    
                
                
            
        
浙公网安备 33010602011771号