Have Your Cake and Eat It Too

暴力+二分

#include<iostream>
#include<algorithm>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<stack>
#include<queue>
#include<bitset>
#define int long long
using namespace std;
//priority_queue<int,vector<int>,greater<int>>q;
//const int mod=1e9+7;
//map<int,int>mp;
//int m[100005];
//void exgcd(int a,int b,int &x,int &y) {
//	if(b==0) {
//		x=1,y=0;
//		return;
//	}
//	exgcd(b,a%b,x,y);
//	int tmp=x;
//	x=y;
//	y=tmp-(a/b)*y;
//}
//int modd(int a, int mod) {
//	int x,y;
//	exgcd(a,mod,x,y);
//	return (x%mod+mod)%mod;
//}
//int A(int c) {
//	int v=1;
//	for(int i=1; i<=c; i++)v=((v%mod)*i%mod)%mod;
//	return v%mod;
//}
struct node {
	int a,b,c;
};
node sk[300005];
int sua[300005],sub[300005],suc[300005];
signed main() {
	int t;
	cin>>t;
	while(t--) {
		int f=0;
		int n;
		cin>>n;
		sua[n+1]=sub[n+1]=suc[n+1]=0;
		for(int i=1; i<=n; i++) {
			cin>>sk[i].a;
			sua[i]=sua[i-1]+sk[i].a;
		}
		for(int i=1; i<=n; i++) {
			cin>>sk[i].b;
			sub[i]=sub[i-1]+sk[i].b;
		}
		for(int i=1; i<=n; i++) {
			cin>>sk[i].c;
			suc[i]=suc[i-1]+sk[i].c;
		}
		int bz=sub[n]/3;
		if(sub[n]%3)bz+=1;
		int la=0,ra=0,lb=0,rb=0,lc=0,rc=0;
		int aa=0,bb=0,cc=0;
		int tm=bz;
		int ss=lower_bound(sua+1,sua+1+n,tm)-sua;
		if(ss!=n+1) {
			aa=sua[ss];
			int s1=lower_bound(sub+1,sub+1+n,sub[ss]+tm)-sub;
			if(s1!=n+1) {
				bb=sub[s1]-sub[ss];
				cc=suc[n]-suc[s1];
				if(aa>=bz&&bb>=bz&&cc>=bz) {
					la=1,ra=ss;
					lb=ss+1,rb=s1;
					lc=s1+1,rc=n;
					f=1;
				}
			}
		}
		ss=0;
		aa=0,bb=0,cc=0;
		ss=lower_bound(sua+1,sua+1+n,tm)-sua;
		if(ss!=n+1) {
			aa=sua[ss];
			int s1=lower_bound(suc+ss,suc+1+n,suc[ss]+tm)-suc;
			if(s1!=n+1) {
				cc=suc[s1]-suc[ss];
				bb=sub[n]-sub[s1];
				if(aa>=bz&&bb>=bz&&cc>=bz) {
					la=1,ra=ss;
					lc=ss+1,rc=s1;
					lb=s1+1,rb=n;
					f=1;
				}
			}
		}
		ss=0;
		aa=0,bb=0,cc=0;
		ss=lower_bound(sub+1,sub+1+n,tm)-sub;
		if(ss!=n+1) {
			bb=sub[ss];
			int s1=lower_bound(sua+ss,sua+1+n,sua[ss]+tm)-sua;
			if(s1!=n+1) {
				aa=sua[s1]-sua[ss];
				cc=suc[n]-suc[s1];
				if(aa>=bz&&bb>=bz&&cc>=bz) {
					lb=1,rb=ss;
					la=ss+1,ra=s1;
					lc=s1+1,rc=n;
					f=1;
				}
			}
		}
		ss=0;
		aa=0,bb=0,cc=0;
		ss=lower_bound(sub+1,sub+1+n,tm)-sub;
		if(ss!=n+1) {
			bb=sub[ss];
			int s1=lower_bound(suc+1,suc+1+n,suc[ss]+tm)-suc;
			if(s1!=n+1) {
				cc=suc[s1]-suc[ss];
				aa=sua[n]-sua[s1];
				if(aa>=bz&&bb>=bz&&cc>=bz) {
					lb=1,rb=ss;
					lc=ss+1,rc=s1;
					la=s1+1,ra=n;
					f=1;
				}
			}
		}
		ss=0;
		aa=0,bb=0,cc=0;
		ss=lower_bound(suc+1,suc+1+n,tm)-suc;
		if(ss!=n+1) {
			cc=suc[ss];
			int s1=lower_bound(sua+ss,sua+1+n,sua[ss]+tm)-sua;
			if(s1!=n+1) {
				aa=sua[s1]-sua[ss];
				bb=sub[n]-sub[s1];
				if(aa>=bz&&bb>=bz&&cc>=bz) {
					lc=1,rc=ss;
					la=ss+1,ra=s1;
					lb=s1+1,rb=n;
					f=1;
				}
			}
		}
		ss=0;
		aa=0,bb=0,cc=0;
		ss=lower_bound(suc+1,suc+1+n,tm)-suc;
		if(ss!=n+1) {
			cc=suc[ss];
			int s1=lower_bound(sub+ss,sub+1+n,sub[ss]+tm)-sub;
			if(s1!=n+1) {
				bb=sub[s1]-sub[ss];
				aa=sua[n]-sua[s1];
				if(aa>=bz&&bb>=bz&&cc>=bz) {
					lc=1,rc=ss;
					lb=ss+1,rb=s1;
					la=s1+1,ra=n;
					f=1;
				}
			}
		}
		if(f) {
			cout<<la<<" "<<ra<<" "<<lb<<" "<<rb<<" "<<lc<<" "<<rc<<endl;
		} else {
			cout<<"-1"<<endl;
		}
	}
}

这个错误de了半个多小时没找出来,赛后秒找到,破防

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值