明显要求最后差分数列除第一项都是0的情况。然而为什么答案是只用统计上升和下降的差分呢????
有个比较牵强的说法,>0的差分其实是指后面连续一段降的话只需要上升的差分这么多。
而<0的话其实是把后面连续一段升高为相同高度所需的操作数。
如果你升高的话只能连续升高,或下降的话只能连续下降。因为上升的话后面所有的数都上升了,如果你再下降的话,就会有重复的多余操作。下降同理。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define inf 1000000000
using namespace std;
int read()
{
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
return x*f;
}
ll ans1,ans2;
int n;
int a[100005];
int main()
{
n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=2;i<=n;i++)
if(a[i]>a[i-1])ans1+=a[i]-a[i-1];
else ans2+=a[i-1]-a[i];
printf("%lld\n%d",max(ans1,ans2),abs(ans1-ans2)+1);
return 0;
}