解题:Poetize6 IncDec Sequence

题面

差分原数列得到差分数组$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 }
View Code
原文地址:https://www.cnblogs.com/ydnhaha/p/9677739.html