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 }