https://www.luogu.org/problem/show?pid=1678
二分找上下界即可
#include<cstdio>
#include<algorithm>
#include<cstring>
#define ms(i,j) memset(i,j, sizeof i);
/* NOIP2016倒计时,RP++
Luogu: P1678 烦恼的高考志愿
*/
using namespace std;
int m,n;
int school[100005];
int ans = 0;
int abss(int x) {return x>=0 ? x : -x;}
int bcl(int x)
{
int l=1, r=m;
while (r-l>1)
{
int mid = (l+r)/2;
if (school[mid]<=x)
{
l = mid;
} else r = mid;
}
return l;
}
int bcu(int x)
{
int l=1, r=m;
while (r-l>1)
{
int mid = (l+r)/2;
if (school[mid]>=x)
{
r = mid;
} else l = mid;
}
return r;
}
int main()
{
scanf("%d%d", &m, &n);
for (int i=1;i<=m;i++) scanf("%d", &school[i]);
sort(school+1, school+1+m);
for (int i=1;i<=n;i++) {
int student;
scanf("%d", &student);
int b1 = bcl(student);
int b2 = bcu(student);
ans += min(abss(student-school[b1]),abss(student-school[b2]));
}
printf("%d\n", ans);
return 0;
}