1. 程式人生 > >【EOJ】莫干山奇遇

【EOJ】莫干山奇遇

莫干山奇遇

出題人當然是希望出的題目有關 oxx,於是想方設法給題目配上一些有關 oxx 的背景故事,使得它看起來不那麼無趣。但有的時候卻無法引入合適的小姐姐,使得 oxx 顯得非常可憐。所以出題人刪除了故事,只留下一個枯燥乏味的數學問題。

【故事已刪除】

給一個長度為 n 的序列 a1,a2,…,an,求一個長度為 m 的序列 b1,b2,…,bm 使得:

a1,a2,…,an b1,b2,…,bm 的子序列(不一定連續),且

存在常數 p>0 使得 b1,b2,…,bm 是一個 p-莫干山序列。

序列 s1,s2,…,sn p-莫干山序列,當且僅當:存在 0≤x<p 對於

1≤i≤n 滿足

si=(x+i)mod p

m 的最小值。

Input

第一行一個整數 n (1≤n≤2⋅105)

第二行 n 個整數用空格隔開 a1,a2,…,an (0≤ai≤1e9)

Output

輸出最小的 m

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+100;
ll n,a[N],ans=0,p=-1;
int main()
{
    scanf("%lld",&n);
    for(int i=0;i<n;i++){
        scanf("%lld",&a[i]);
        p=max(p,a[i]);
    }
    p++;
    ans=1;
    ll pre=a[0];
    for(int i=1;i<n;i++){
        if(pre<a[i]){
            ans+=(a[i]-pre);
        }else{
            ans+=(p-pre+a[i]);
        }
        pre=a[i];
    }
    //ans+=n;
    printf("%lld\n",ans);
    return 0;
}