题目:1248. 灵能传输
思路:仔细分析后会发现对某一点i操作,有影响的是si-1和si换了一个位置,也就是说只有s0和sn不能移动,然后对s0~sn进行排序。安排si在合适的位置即可
大佬的思路
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<double,double>PII;
const int N=3e5+10;
const int mod=1000000009;
int n,m;
LL a[N];
LL b[N];
bool sta[N];
int main(){
int t;
cin>>t;
while(t--){
cin>>n;
memset(sta,0,sizeof sta);
for(int i=1;i<=n;i++){
cin>>a[i];
a[i]+=a[i-1];
}
LL x_l=a[0],x_r=a[n];
if(x_l>x_r){
swap(x_l,x_r);
}
sort(a,a+n+1);
for(int i=0;i<=n;i++){
if(x_l==a[i]){
x_l=i;
break;
}
}
for(int i=n;i>=0;i--){
if(x_r==a[i]){
x_r=i;
break;
}
}
int l=0,r=n;
for(int i=x_l;i>=0;i-=2){
b[l++]=a[i];
sta[i]=1;
}
for(int i=x_r;i<=n;i+=2){
b[r--]=a[i];
sta[i]=1;
}
for(int i=0;i<=n;i++){
if(!sta[i]){
b[l++]=a[i];
}
}
LL res=0;
for(int i=1;i<=n;i++){
if(res<abs(b[i]-b[i-1])){
res=abs(b[i]-b[i-1]);
}
}
printf("%lld\n",res);
}
return 0;
}