100. IncDec序列



将差分数组中所有的正数相加求和记作a,所有的负数相加求和记作b(此处负数的和为正值)
假设a = 5, b = 6那么正数5和负数5可以抵消,剩下的1进行一次+1/-1操作,此时共进行了min(a, b) + abs(a - b) = max(a, b)次
对于结果的种类,因为数列中的数全部一样,即b[2] - b[n]全部为0,即a[1] - a[n]全部相等,那么就转化为a[1]有几种可能的结果
最终序列a可能会有abs(a−b)+1种情况
#include <iostream>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 100010;
int a[N];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; ++ i) cin >> a[i];
for(int i = n; i >= 2; -- i) a[i] -= a[i - 1];
LL pos = 0, neg = 0;
for(int i = 2; i <= n; ++ i)
{
if(a[i] > 0) pos += a[i];
else if(a[i] < 0) neg -= a[i];
}
cout << max(pos, neg) << endl;
cout << abs(pos - neg) + 1 << endl;
return 0;
}

浙公网安备 33010602011771号