差分原数列得到差分数组$dif$,这样对于$dif[2]->dif[n]$会多出来两个“空位置”$1$和$n+1$。然后区间加减就变成了使一个位置$+1$,另一个位置$-1$(可以对“空位置”操作)。
那么第一问的答案就是差分数组中$dif[2]->dif[n]$中正数的和$sum1$和负数和的绝对值$sum2$取$max$(贪心地互相消,消不了的给“空位置”消)。第二问就是把消不了的$|sum1-sum2|$给空位置配对,答案是$|sum1-sum2|+1$(注意考虑零的情况)
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=;
long long num[N],dif[N];
long long n,sum1,sum2;
long long abss(long long x)
{
return x>?x:-x;
}
int main ()
{
scanf("%lld",&n);
for(int i=;i<=n;i++)
scanf("%lld",&num[i]);
dif[]=num[];
for(int i=;i<=n;i++)
{
dif[i]=num[i]-num[i-];
if(dif[i]>) sum1+=dif[i];
else sum2-=dif[i];
}
printf("%lld\n%lld",max(sum1,sum2),abss(sum1-sum2)+);
return ;
}