解题思路:
其实就是随意搞下就行。
求|a - b| + |b - c| + |c - a|的最小值
显然枚举a,然后二分整个{b}找到离a最近的b,再二分整个{c}找到离a最近的c和离b最近的c
比较一下谁最近,就可以O(nlogn)搞出来了。
代码:
#include <set>
#include <map>
#include <cmath>
#include <queue>
#include <stack>
#include <bitset>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <functional>
using namespace std;
const int maxn = 1e5 + 5;
int a[maxn], b[maxn], c[maxn];
inline long long Abs(long long x) {
return (x >= 0 ? x : -x);
}
int main() {
ios::sync_with_stdio(false); cin.tie(0);
int n, m, l; cin >> n >> m >> l;
for ( int i = 0; i < n; ++i ) cin >> a[i];
for ( int i = 0; i < m; ++i ) cin >> b[i];
for ( int i = 0; i < l; ++i ) cin >> c[i];
sort(a, a + n); sort(b, b + m); sort(c, c + l);
long long ans = 1e18 + 5;
for ( int i = 0; i < n; ++i ) {
int pos_b = lower_bound(b, b + m, a[i]) - b;
int pos_c = lower_bound(c, c + l, a[i]) - c;
ans = min(ans, Abs(a[i] - b[pos_b]) + Abs(b[pos_b] - c[pos_c]) + Abs(c[pos_c] - a[i]));
if ( pos_c > 0 ) ans = min(ans, Abs(a[i] - b[pos_b]) + Abs(b[pos_b] - c[pos_c-1]) + Abs(c[pos_c-1] - a[i]));
pos_c = lower_bound(c, c + l, b[pos_b]) - c;
ans = min(ans, Abs(a[i] - b[pos_b]) + Abs(b[pos_b] - c[pos_c]) + Abs(c[pos_c] - a[i]));
if ( pos_c > 0 ) ans = min(ans, Abs(a[i] - b[pos_b]) + Abs(b[pos_b] - c[pos_c-1]) + Abs(c[pos_c-1] - a[i]));
if ( pos_b > 0 ) {
pos_c = lower_bound(c, c + l, b[pos_b-1]) - c;
ans = min(ans, Abs(a[i] - b[pos_b-1]) + Abs(b[pos_b-1] - c[pos_c]) + Abs(c[pos_c] - a[i]));
if ( pos_c > 0 ) ans = min(ans, Abs(a[i] - b[pos_b-1]) + Abs(b[pos_b-1] - c[pos_c-1]) + Abs(c[pos_c-1] - a[i]));
}
}
cout << ans << endl;
return 0;
}