用的是确定满足要求的前后缀(ps1,ps2) 莫名TLE
#include<bits/stdc++.h>
using namespace std;
int t,n,a[4][200005],ps1[4],ps2[4];
long long sum[4][200005];
struct node{
int ps,x,y;
} ans[3];
bool cmp(node aa,node bb){ return aa.ps<bb.ps; }
int main(){
scanf("%d",&t);
while(t--){
memset(sum,0,sizeof(sum));
scanf("%d",&n);
long long tot=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=n;j++){
scanf("%d",&a[i][j]);
if(i==1) tot+=a[i][j];
sum[i][j]=sum[i][j-1]+a[i][j];
}
tot=(tot+2)/3;
for(int i=1;i<=3;i++){
for(int j=1;j<=n;j++)
if(sum[i][j]>=tot){
ps1[i]=j;
break;
}
for(int j=n-1;j>=0;j--)
if(sum[i][n]-sum[i][j]>=tot){
ps2[i]=j+1;
break;
}
}
int id[3]={1,2,3};
bool flag=0;
do{
for(int i=0;i<3;i++)
ans[i].ps=id[i];
ans[0].x=1,ans[0].y=ps1[id[0]];
ans[1].x=ps1[id[0]]+1,ans[1].y=ps2[id[2]]-1;
if(sum[id[1]][ans[1].y]-sum[id[1]][ans[1].x-1]<tot)
continue;
ans[2].x=ps2[id[2]],ans[2].y=n;
sort(ans,ans+3,cmp);
for(int i=0;i<3;i++)
printf("%d %d ",ans[i].x,ans[i].y);
printf("\n");
flag=1;
break;
}while(next_permutation(id,id+3));
if(!flag) printf("-1\n");
}
return 0;
}