传说门
刚好今晚是中国场!
其实这道题比较水,但当时思路错,一心想着化简公式,浪费了好多时间a.a
题意:三个数组,求(x-y)(x-y)+(x-z)(x-z)+(y-z)*(y-z)的最小值
题解:6nlogn,先sort三个数组a,b,c, 六次枚举二分查找,再每次min找最小值,例如:先固定数组a,再在数组b,c中利用lower_bound找到第一个大于等于a[i]的数,
#pragma GCC optimize(2)
#include
#define ll long long
#define endl '\n'
using namespace std;
const int manx=1e5+5;
ll t,a1,b1,c1;
ll a[manx],b[manx],c[manx];
ll checks(ll a[],ll a1,ll b[],ll b1,ll c[],ll c1)
{
ll add=2e18,x,y,z;
for(int i=1; i=1&&k=x) //确保数组b中有比大于等于x的值
y=b[k];
else
continue;
ll l=lower_bound(c+1,c+c1,x)-c;
if(l>=1&&l<=c1&&c[l]>t;
while(t--)
{
cin>>a1;
cin>>b1;
cin>>c1;
for(int i=1;i>a[i];
for(int i=1;i>b[i];
for(int i=1;i>c[i];
sort(a+1,a+1+a1);
sort(b+1,b+1+b1);
sort(c+1,c+1+c1);
ll ans=2e18;
ans=min(ans,checks(a,a1,b,b1,c,c1));ans=min(ans,checks(a,a1,c,c1,b,b1));
ans=min(ans,checks(b,b1,a,a1,c,c1));ans=min(ans,checks(b,b1,c,c1,a,a1));
ans=min(ans,checks(c,c1,b,b1,a,a1));ans=min(ans,checks(c,c1,a,a1,b,b1));
cout<<ans<<endl;
}
}