求助 #2 TLE
查看原帖
求助 #2 TLE
514936
EllinY楼主2024/7/8 11:52

用的是确定满足要求的前后缀(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;
}
2024/7/8 11:52
加载中...