51nod1482

Posted 宣毅鸣

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了51nod1482相关的知识,希望对你有一定的参考价值。

题解:

发现是一个环,而环的题目有一些就是要转化成为链

首先找到一个最高点,中间断开

然后当作一条链来做

代码:

#include<cstdio>
#include<algorithm>
#define fo(i,a,b) for(i=a;i<=b;i++)
#define fd(i,a,b) for(i=a;i>=b;i--)
using namespace std;
typedef long long ll;
const int N=1000000+10;
int a[N],b[N],left[N],right[N],same[N],sta[N],bz[N];
int i,j,k,l,t,n,m,mx,top;
ll ans;
int read()
{
    int x=0;
    char ch=getchar();
    while (ch<0||ch>9) ch=getchar();
    while (ch>=0&&ch<=9)
     {
        x=x*10+ch-0;
        ch=getchar();
     }
    return x;
}
int main()
{
    n=read();
    fo(i,1,n)
     {
        a[i]=read();
        if (!mx||a[i]>a[mx]) mx=i;
     }
    fo(i,mx,n) b[++top]=a[i];
    fo(i,1,mx-1) b[++top]=a[i];
    fo(i,1,n) a[i]=b[i];
    top=0;
    fo(i,2,n)
     {
        while (top&&a[i]>=a[sta[top]]) top--;
        left[i]=sta[top];
        sta[++top]=i;
     }
    top=0;
    sta[0]=n+1;
    fd(i,n,2)
     {
        while (top&&a[i]>=a[sta[top]])
         {
            if (a[i]==a[sta[top]]) same[i]=same[sta[top]]+1;
            top--;
         }
        right[i]=sta[top];
        sta[++top]=i;
     }
    fo(i,2,n)
     {
        if (left[i]>0) ans++;
        if (right[i]<=n) ans++;
        ans+=(ll)same[i];
     }
    mx=0;
    fo(i,2,n)
     {
        if (mx<=a[i]) bz[i]=1;
        mx=max(mx,a[i]);
     }
    mx=0;
    fd(i,n,2)
     {
        if (mx<=a[i]) bz[i]=1;
        mx=max(mx,a[i]);
     }
    fo(i,2,n) ans+=bz[i];
    printf("%I64d\n",ans);
}

 

以上是关于51nod1482的主要内容,如果未能解决你的问题,请参考以下文章

优化算法差分进化优化杂草优化(DIWO)含Matlab源码 1482期

51nod1563

51Nod1039 N^3 Mod P 数论 原根 BSGS

51nod1174(RMQ)

51nod1105(二分)

51nod 1179:最大的最大公约数