cf #635 (Div. 2) D. Xenia and Colorful Gems

有一种显然易见的策略,首先把r,g,b都排序  然后遍历 r  当前遍历到r[i] 通过lower_bound在g数组中找和r[i] 最近的两个元素设为 g[k] g[k+1]   我们再在 b数组中找和 (r[i]+g[k])/2最近的两个值   记为 b[x] b[x+1]   对于 g[k+1]我们进行同样操作  得到 b[y] b[y+1]    这样我们 求 四个元组 (r[i],g[k],b[x]) (r[i],g[k],b[x+1]) (r[i],g[k+1],b[y]) (r[i],g[k+1],b[y+1])  的最小值即可   

但是这样还不够  我们还需要按 r,b,g这样的顺序来一遍才能保证所有的情况都考虑到了

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
typedef long long ll;
vector<ll>r,g,b;
ll cal(ll a,ll b,ll c){
	return (a-b)*(a-b)+(a-c)*(a-c)+(b-c)*(b-c);
}
int main(){
	int t;
	scanf("%d",&t);
	while(t--){
		int nr,ng,nb;
		scanf("%d%d%d",&nr,&ng,&nb);
		r.clear(),g.clear(),b.clear();
		for(int i = 1; i <= nr; i++){
			ll x;
			scanf("%lld",&x);
			r.push_back(x);
		}
		for(int i = 1; i <= ng; i++){
			ll x;
			scanf("%lld",&x);
			g.push_back(x);
		}
		for(int i = 1; i <= nb; i++) {
			ll x;
			scanf("%lld",&x);
			b.push_back(x);
		}
		sort(r.begin(),r.end());
		sort(g.begin(),g.end());
		sort(b.begin(),b.end());
		ll ans = 5e18;
		for(int i = 0; i < nr; i++){
			ll x=0,y=0,z=0,q=0,e=0,c;
			x=r[i];
			auto w = lower_bound(g.begin(),g.end(),x);
			if(w==g.end()) {
			w--,z=*w;
			}else if(w!=g.begin()) y=*w,z=*(--w);
			else y=*w;
			if(y!=0){
				c=(x+y)/2;
				auto v = lower_bound(b.begin(),b.end(),c);
				if(v==b.end()){
					v--,q=*v;
				}else if(v!=b.begin()) e=*v,q=*(--v);
				else e=*v;
				if(q!=0) ans=min(ans,cal(x,y,q));
				if(e!=0) ans=min(ans,cal(x,y,e));
			}
			if(z!=0){
				c=(x+z)/2;
				auto v = lower_bound(b.begin(),b.end(),c);
				if(v==b.end()){
					v--,q=*v;
				}else if(v!=b.begin()) e=*v,q=*(--v);
				else e=*v;
				if(q!=0) ans=min(ans,cal(x,z,q));
				if(e!=0) ans=min(ans,cal(x,z,e));
			}
		}
		swap(g,b);
		swap(ng,nb);
		//按rbg顺序来 
		for(int i = 0; i < nr; i++){
			ll x=0,y=0,z=0,q=0,e=0,c;
			x=r[i];
			auto w = lower_bound(g.begin(),g.end(),x);
			if(w==g.end()) {
			w--,z=*w;
			}else if(w!=g.begin()) y=*w,z=*(--w);
			else y=*w;
			if(y!=0){
				c=(x+y)/2;
				auto v = lower_bound(b.begin(),b.end(),c);
				//printf("v=%lld\n",*v);
				if(v==b.end()){
					v--,q=*v;
				}else if(v!=b.begin()) e=*v,q=*(--v);
				else e=*v;
				//printf("c=%lld x=%lld y=%lld e=%lld\n",c,x,y,e);
				//printf("x=%lld y=%lld q=%lld\n",x,y,q);
				if(q!=0) ans=min(ans,cal(x,y,q));
				if(e!=0) ans=min(ans,cal(x,y,e));
			}
			if(z!=0){
				c=(x+z)/2;
				auto v = lower_bound(b.begin(),b.end(),c);
				if(v==b.end()){
					v--,q=*v;
				}else if(v!=b.begin()) e=*v,q=*(--v);
				else e=*v;
				//printf("x=%lld z=%lld e=%lld\n",x,z,e);
				//printf("x=%lld z=%lld q=%lld\n",x,z,q);
				if(q!=0) ans=min(ans,cal(x,z,q));
				if(e!=0) ans=min(ans,cal(x,z,e));
			}
		}
		printf("%lld\n",ans);
	}
}
/*
2
3 4 1
3 2 1
7 3 3 4
6
*/
原创文章 85 获赞 103 访问量 2504

猜你喜欢

转载自blog.csdn.net/weixin_43824564/article/details/105552319