原题链接https://www.acwing.com/problem/content/1250/
Code
#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 3e5+10;
typedef long long ll;
int t,n;
ll a[N];
ll s[N];
bool vis[N];
int main()
{
cin >> t;
while(t--)
{
cin >> n;
s[0] = 0;
for(int i=1; i<=n; i++)
{
cin >> a[i];
s[i] = s[i-1] + a[i];
}
ll s0 = s[0], sn=s[n];
if(s0 > sn)
swap(s0,sn);
sort(s,s+n+1);
// 找s0 和 sn 在排过序的s数组中的位置
for(int i=0; i<=n; i++)
if(s[i]==s0){
s0 = i;
break;
}
for(int i=n; i>=0; i--)
if(s[i]==sn)
{
sn = i;
break;
}
memset(vis,0,sizeof vis);
int l=0,r=n;
for(int i=s0; i>=0; i-=2)
{
a[l++] = s[i];
vis[i] = true;
}
for(int i=sn; i<=n; i+=2)
{
a[r--] = s[i];
vis[i] =true;
}
for(int i=0; i<=n; i++)
if(!vis[i])
a[l++] = s[i];
ll ans=0;
for(int i=1; i<=n; i++)
ans = max(ans,abs(a[i]-a[i-1]));
cout << ans << endl;
}
return 0;
}