Codeforces847H Load Testing

99 篇文章 0 订阅
45 篇文章 0 订阅

标签:DP

Polycarpplans to conduct a load testing of its new project Fakebook. He already agreedwith his friends that at certain points in time they will send requests toFakebook. The load testing will last n minutesand in the i-th minute friendswill send ai requests.

Polycarpplans to test Fakebook under a special kind of load. In case the informationabout Fakebook gets into the mass media, Polycarp hopes for a monotone increaseof the load, followed by a monotone decrease of the interest to the service.Polycarp wants to test this form of load.

Your taskis to determine how many requests Polycarp must add so that before some momentthe load on the server strictly increases and after that moment strictlydecreases. Both the increasing part and the decreasing part can be empty (i. e.absent). The decrease should immediately follow the increase. In particular,the load with two equal neigbouring values is unacceptable.

Forexample, if the load is described with one of the arrays [1, 2, 8, 4, 3], [1, 3, 5] or [10], then such load satisfies Polycarp (in eachof the cases there is an increasing part, immediately followed with adecreasing part). If the load is described with one of the arrays [1, 2, 2, 1], [2, 1, 2] or [10, 10], then such load does not satisfyPolycarp.

HelpPolycarp to make the minimum number of additional requests, so that theresulting load satisfies Polycarp. He can make any number of additionalrequests at any minute from 1 to n.

Input

The firstline contains a single integer n (1 ≤ n ≤ 100 000) — the duration ofthe load testing.

The secondline contains n integers a1, a2, ..., an (1 ≤ ai ≤ 109), where ai is the number ofrequests from friends in the i-th minuteof the load testing.

Output

Print theminimum number of additional requests from Polycarp that would make the loadstrictly increasing in the beginning and then strictly decreasing afterwards.

Example

Input

5
1 4 3 2 5

Output

6

Input

5
1 2 2 2 1

Output

1

Input

7
10 20 40 50 70 90 30

Output

0

Note

In thefirst example Polycarp must make two additional requests in the third minuteand four additional requests in the fourth minute. So the resulting load willlook like: [1, 4, 5, 6, 5]. Intotal, Polycarp will make 6 additionalrequests.

In thesecond example it is enough to make one additional request in the third minute,so the answer is 1.

In thethird example the load already satisfies all conditions described in thestatement, so the answer is 0.

分析:在反复阅读题面后,你可以很轻松的发现(这句高逼格的话是机房里的实习老师教我的233),暴力O(n^2)很容易写出,就和之前的一道普及组题目合唱队列一样,外层循环波峰的位置,内层循环左右两边至波谷的最小增加量,so easy

再次观察后发现,可以优化掉内层的一重循环,用f[i]表示从第一个元素到第i个元素需要修改的最小增加量,g[i]表示从最后一个元素到第i个元素需要修改的最小增加量

最后O(n)枚举波峰的位置,更新答案

 

Code

 

#include<bits/stdc++.h>
#define rep(i,a,b) for(int i=a;i<=b;i++)
#define dep(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
 
long long n,a[1000005],f[1000005],g[1000005],b[1000005],ans=1e18,s=0;
int main()
{
         scanf("%d",&n);
         rep(i,1,n){scanf("%d",&a[i]);b[i]=a[i];}
         rep(i,1,n)
             if(a[i]<=a[i-1]){f[i]=f[i-1]+a[i-1]+1-a[i];a[i]=a[i-1]+1;}else f[i]=f[i-1];
         dep(i,n,1)
             if(b[i]<=b[i+1]){g[i]=g[i+1]+b[i+1]+1-b[i];b[i]=b[i+1]+1;}else g[i]=g[i+1];
         rep(k,0,n){
                 s=f[k]+g[k+1];
             if(a[k]==b[k+1])s++;
             if(s<ans)ans=s;
         }
         cout<<ans<<endl;
         return 0;
}

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值