https://codeforces.com/contest/1336/problem/B
2.Idea
Assuming x <= y <=z.
Enumerating middle value, and find smallest and biggest value by binary_search.
3.Source
int nr, ng, nb;
ll ans = 1LL << 60;
ll calc(ll x, ll y, ll z)
{
return (x - y)*(x - y) + (y - z)*(y - z) + (x - z)*(x - z);
}
void solve(vector<int> a, vector<int> b, vector<int> c) {
for (auto x : a) {
auto y = lower_bound(b.begin(), b.end(), x);
auto z = upper_bound(c.begin(), c.end(), x);
if (y == b.end() || z == c.begin()) { continue; }
z--;
ans = min(ans, calc(x, *y, *z));
}
}
int main()
{
int t; cin >> t;
while (t--) {
ans = 1LL << 62;
cin >> nr >> ng >> nb;
vector<int> r(nr), g(ng), b(nb);
for (int i = 0; i < nr; i++) {
cin >> r[i];
}
for (int i = 0; i < ng; i++) {
cin >> g[i];
}
for (int i = 0; i < nb; i++) {
cin >> b[i];
}
sort(r.begin(), r.end());
sort(g.begin(), g.end());
sort(b.begin(), b.end());
solve(r, g, b);
solve(r, b, g);
solve(g, r, b);
solve(g, b, r);
solve(b, g, r);
solve(b, r, g);
cout << ans << endl;
}
return 0;
}
No comments:
Post a Comment