农夫约翰有 N块草地排成一行,其中草地 ii 的细菌水平与健康草的细菌水平相差ai。
例如,如果 ai=−3,则草地 i的细菌水平比正常水平低 3,需要额外添加恰好 3 个单位的细菌才能将其提高到被认为是健康的程度。
农夫约翰想要确保每一块草地都被修复至健康的细菌水平。
方便的是,他有两种品牌的农药可以喷洒在他的田地里,一种可以添加细菌,另一种可以去除细菌。
当农夫约翰喷洒任一类型的农药时,他站在草地 N(最右边的草地)并为他的喷雾器选择功率等级 LL(1≤L≤N)。
喷雾器对靠近农夫约翰的草地效果最大,随着距离增加效果逐渐减弱。
如果农夫约翰选择添加细菌的农药,则 L 单位的细菌将被添加至草地 NN,L−1 单位添加至草地 N−1,L−2单位添加至草地 N−2,以此类推。
草地 1…N−L不会得到任何细菌,因为喷雾器设置的功率不足以到达它们。
类似地,如果农夫约翰选择去除细菌的农药,则 L 单位的细菌将被从草地 N 去除,L−1 单位被从草地 N−1去除,以此类推。
同样,草地 1…N−L 将不受影响。
求农夫约翰使用喷雾器的最少次数,使得每块草地都具有健康草的推荐细菌值。
输入保证答案不超过 109。
输入格式
输入的第一行包含 N。
第二行包含 NN 个整数 a1…aN,为每块草地的初始细菌水平。
输出格式
输出一个整数,为使每块草地都具有健康草的推荐的细菌值所需使用喷雾器的最少次数。
本题需要两次差分,开始的时候从左到右,农药效果呈等差数列,一次差分之后,变成一个常数,也就是差分常见题型。再次差分,这时候整个题就会变成某些地方有值,其他地方为0,答案就是绝对值相加。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=2e5+10;
int n;
int a[N];
int d1[N],d2[N];//差分数组
int main()
{
scanf("%d",&n);//n块草地
for(int i=1;i<=n;i++) scanf("%d",&a[i]);//细菌数
d1[1]=a[1];
for(int i=2;i<=n;i++)
d1[i]=a[i]-a[i-1];
d2[1]=d1[1];
for(int i=2;i<=n;i++)
d2[i]=d1[i]-d1[i-1];
int res=0;
for(int i=1;i<=n;i++) res+=abs(d2[i]);
cout<<res<<endl;
return 0;
}