Xeniaは、貴族として生まれた少女です。彼女の家族の柔軟性と過酷さのために、Xeniaは自分を楽しませるいくつかの方法を見つける必要があります。
Xeniaは最近、nrの赤い宝石、ngの緑の宝石、nbの青い宝石を購入しました。それぞれの宝石には重みがあります。
今、彼女は3つの宝石を選ぶつもりです。
Xeniaはカラフルなものが大好きなので、各色の宝石を1つだけ選びます。
Xeniaはバランスが大好きなので、体重の差がほとんどない宝石を選びます。
具体的には、選択した宝石の重みがx、y、zであるとすると、Xeniaは(x-y)2+(y-z)2+(z-x)2の最小値を見つけたいと考えています。彼女の親愛なる友人として、あなたは彼女を助けることができますか?
入力
最初の行には、単一の整数t(1≤t≤100)—テストケースの数が含まれます。次に、t個のテストケースが続きます。
各テストケースの最初の行には、3つの整数nr、ng、nb(1≤nr、ng、nb≤105)が含まれています。それぞれ、赤い宝石、緑の宝石、青い宝石の数です。
各テストケースの2行目には、nr整数r1、r2、…、rnr(1≤ri≤109)が含まれています。riはi番目の赤い宝石の重みです。
各テストケースの3行目には、ng整数g1、g2、…、gng(1≤gi≤109)が含まれています。giはi番目の緑の宝石の重みです。
各テストケースの4行目には、nb整数b1、b2、…、bnb(1≤bi≤109)が含まれています。biはi番目の青い宝石の重みです。
∑nr≤105、∑ng≤105、∑nb≤105(すべてのテストケースの合計)であることが保証されています。
出力
テストケースごとに、1つの整数を含む行を出力します。これは、Xeniaが検索する最小値です。
入力例
5
2 2 3
7 8
6 3
3 1 4
1 1 1
1
1
1000000000
2 2 2
1 2
5 4
6 7
2 2 2
1 2
3 4
6 7
3 4 1
3 2 1
7 3 3 4
6
出力
14
1999999996000000002
24
24
14
注
最初のテストケースでは、Xeniaには以下の宝石があります。
彼女が重み7の赤い宝石、重み6の緑の宝石、重み4の青い宝石を選択した場合、(x-y)2+(y-z)2+(z- x)2 =(7-6)2+(6-4)2+(4-7)2 = 14.
アイデア:3つの数値が3つとほぼ同じである場合、上記の式は使い果たされますおそらく小さい。選択した3つの数値は大小である必要があるため、配列を修正し、他の2つの配列に移動します。1つの配列でそれ以上の最初の数値を見つけ、もう1つの配列でそれ以下の最初の数値を見つけます、そして上記の答えに従って最小値を取ります。合計で3つのアレイがあるため、合計で6つの組み合わせがあります。O(6nlogn)
コードは次のとおりです。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int maxx=1e5+100;
ll r[maxx],g[maxx],b[maxx];
int nr,ng,nb;
inline ll judge(ll a[],int na,ll b[],int nb,ll c[],int nc)
{
ll x,y,z;
ll ans=3e18;
for(int i=1;i<=na;i++)
{
x=a[i];
int pos1=lower_bound(b+1,b+nb+1,x)-b;
int pos2=upper_bound(c+1,c+nc+1,x)-c;
if(pos2==1||pos1>nb) continue;
pos2--;
y=b[pos1];
z=c[pos2];
ans=min(ans,((x-y)*(x-y)+(x-z)*(x-z)+(z-y)*(z-y)));
}
return ans;
}
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d%d",&nr,&ng,&nb);
for(int i=1;i<=nr;i++) cin>>r[i];
for(int i=1;i<=ng;i++) cin>>g[i];
for(int i=1;i<=nb;i++) cin>>b[i];
sort(g+1,g+1+ng);
sort(b+1,b+1+nb);
sort(r+1,r+1+nr);
ll ans=3e18;
ans=min(ans,judge(r,nr,g,ng,b,nb));
ans=min(ans,judge(r,nr,b,nb,g,ng));
ans=min(ans,judge(g,ng,r,nr,b,nb));
ans=min(ans,judge(g,ng,b,nb,r,nr));
ans=min(ans,judge(b,nb,r,nr,g,ng));
ans=min(ans,judge(b,nb,g,ng,r,nr));
cout<<ans<<endl;
}
return 0;
}
この質問は、長い間少し不快です。。
頑張って(o)/〜