codeforce 5E(dp阵亡)

很经典的题目,我没做出来,参照这例程写的,这题真的好好琢磨一下了

#include<iostream>
using namespace std;
int main()
{
    int n;
    cin>>n;
    int*l=new int[n+1]();
    int*r=new int[n+1]();
    int*c=new int[n+1]();
    int*td=new int[n+1];
    int*d=new int[n+1];
    int maxh=0,maxi;
    for(int i=0;i<n;i++)
    {
        cin>>td[i];
        if(td[i]>maxh)
        {
            maxh=td[i];
            maxi=i;
        }
    }
    for(int i=0;i<n;i++)
    {
        d[i]=td[(i+maxi)%n];
    }
    d[n]=maxh;
    c[n]=0;
    for(int i=n-1;i>=0;--i)
    {
        r[i]=i+1;
        while(r[i]<n&&d[i]>d[r[i]])
            r[i]=r[r[i]];
        if(r[i]<n&&d[i]==d[r[i]])
        {
            c[i]=c[r[i]]+1;
            r[i]=r[r[i]];
        }
    }

    for(int i=1;i<n;++i)
    {
        l[i]=i-1;
        while(l[i]>0&&d[i]>=d[l[i]])
            l[i]=l[l[i]];
    }

    long long ans=0;
    for(int i=1;i<n;i++)
    {
        ans+=c[i];
        ans+=2;
        if(l[i]==0&&r[i]==n)
            ans--;
    }

    cout<<ans<<endl;


    return 0;
}

 

posted @ 2013-11-28 15:44  cavehubiao  阅读(298)  评论(0编辑  收藏  举报