解题思路:
本题我们考虑由原数组导出的前缀和数组,我们通过实验发现,对原数组的一个子序列奇数位减一,偶数位加一等价于前缀和数组的一个子序列元素均减一;反之,原数组奇数位加一,偶数位减一等价于前缀和数组一个子序列各个元素均加一,且各个操作一一对应。又因为原数组全为0当且仅当前缀和数组全为0,所以所有的操作我们都可以看作在前缀和数组上的操作,自然结果就是前缀和数组中的最大值减去最小值。
还有,记得开longlong!!!
参考代码:
#include<bits/stdc++.h>
typedef long long ll;
using namespace std;
const int maxn=2e5+10;
int n;
ll a[maxn];
void Solution()
{
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
}
ll maxn=0,minn=0;//初值要赋为0,因为可能存在全正或全负的情况
for(int i=1;i<=n;i++){
a[i]+=a[i-1];
maxn=max(a[i],maxn);
minn=min(a[i],minn);
}
printf("%lld\n",maxn-minn);
return;
}
int main()
{
int t;
scanf("%d",&t);
while(t--){
Solution();
}
return 0;
}