AcWing 100. IncDec序列

原题链接

考察:差分

思路:

        首先认识到差分数组的下标是1~n+1.因为要求序列值全部相同,不同种序列的值取决于b[1]的值.某段区间内全部+1,相当于差分数组b[l]+1,b[r]-1.要让次数最少,让所有操作尽可能有效,即让b数组2~n的正数-1,负数+1.操作次数是max(正数和,负数和).第二个问题:序列个数取决于b[1]的值.我们操作允许的范围区间是[1,n+1].因为要让操作次数最少,首先让2~n的正数与负数抵消.多余的和可以操作在1或者n+1上,避免2~n被破坏.方案是abs(正数和-负数和)+1(在b[1]上不操作.)

 1 #include <iostream>
 2 #include <algorithm>
 3 #include <cstring>
 4 using namespace std;
 5 const int N = 100010;
 6 typedef long long LL;
 7 LL b[N],sum1,sum2;
 8 int main()
 9 {
10     int n;
11     scanf("%d",&n);
12     for(int i=1;i<=n;i++)
13     {
14         int x; scanf("%d",&x);
15         insert(i,i,x);
16     }
17     for(int i=2;i<=n;i++)
18     {
19         if(b[i]>0) sum1+=(LL)b[i];
20         else if(b[i]<0) sum2-=(LL)b[i];
21     }
22     printf("%lld\n%lld\n",max(sum1,sum2),abs(sum1-sum2)+1);
23     return 0;
24 }

 

posted @ 2021-03-06 16:38  acmloser  阅读(53)  评论(0编辑  收藏  举报