有一种显然易见的策略,首先把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
*/