P8684 [蓝桥杯 2019 省 B] 灵能传输
题面传送门
分析
先对灵能传递进行转化。
可以发现,如果把
我们令
如果可以移动
通过上面的思路,不难想到这样的做法:
设
我们对
这样一定是相邻差最小的。
以放
时间复杂度为
代码
#include <bits/stdc++.h>
#define N 300005
#define ll long long
using namespace std;
int T,n;ll a[N],ans;
int main() {
scanf("%d",&T);
while(T--) {
scanf("%d",&n);
for(int i=1;i<=n;++i) scanf("%lld",&a[i]),a[i]+=a[i-1];
sort(a+1,a+n);ans=0;
ll L=0,R=a[n];if(L>R) swap(L,R);
int m=lower_bound(a+1,a+n,L)-a;
ll l=L,r=a[m];
for(int i=m;i;--i) {
if(l<r) swap(l,r);
ans=max(ans,l-a[i]);
l=a[i];
}
ans=max(ans,max(l-r,r-l));
l=a[m],r=R;
for(int i=m+1;i<n;++i) {
if(l>r) swap(l,r);
ans=max(ans,a[i]-l);
l=a[i];
}
ans=max(ans,max(l-r,r-l));
if(m==n) ans=max(ans,R-a[n-1]);
printf("%lld\n",ans);
}
return 0;
}