P4552 [Poetize6] IncDec Sequence 题解
P4552 [Poetize6] IncDec Sequence - 洛谷
差分+贪心
根据题目:一段区间都加1或减1 , 可以想到差分
构建差分数组:sub 我们要让除了sub[1] , 其他全是0
我们可以的操作是:l+1 , r-1 or l-1 , r+1 or 一个数+1 / -1
所以找到 一对正负数 就可以消掉 小的那个数
消掉剩下消不掉的 , 就自己单独消掉
所以 最少操作 : max( sum_p , sum_n )
种类数:此时diff = abs(sum_p - sum_n ) 剩下不可用一对正负数消掉的,需要自己消掉的数
if diff < 0 , 可以给sub[1] 减去(1 - diff) 还要+上原来的sub[1]
if diff > 0 , 可以给sub[1] 加(1 - diff) 还要+上原来的sub[1]
sub[1]是多少整个数组最后就是多少 , 所以有 diff +1 种
#include <bits/stdc++.h>
using namespace std;
#define int long longsigned main() {int n;cin >> n;vector<int> a(n+1,0);vector<int> sub(n+1,0);for(int i=1;i<=n;i++){cin>>a[i]; sub[i] = a[i] - a[i-1];}int sum_p = 0 , sum_n = 0;for(int i=2;i<=n;i++){if(sub[i] >= 0){sum_p += sub[i];}else{sum_n += sub[i];}}sum_n = -sum_n;cout<<max(sum_p , sum_n)<<endl;cout<<abs(sum_p - sum_n)+1<<endl;return 0;
}