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