AOJ 0539 Pizza

昨日は13日の金曜日で本当にひどい目に会いました…
今日は記念すべきCodeforces Round #200です!

解法

本店からの距離d[i]をソートして、距離d[i]とd[j]との間ならその2つの店舗との距離の短い方をとって答えに加算。番兵(?)としてn+1個目の店舗が距離dにあるという情報を入れています。

ソースコード

#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <complex>
#include <string>
#include <sstream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
#include <iostream>
#include <map>
#include <set>
using namespace std;
typedef pair<int,int> P;
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-9
#define INF 2000000000
#define sz(x) ((int)(x).size())
#define fi first
#define sec second
#define SORT(x) sort((x).begin(),(x).end())
#define all(x) (x).begin(),(x).end()
#define EQ(a,b) (abs((a)-(b))<EPS)
int main()
{
	while(1)
	{
		int d,n,m;
		vector<int> vec;
		vec.pb(0);
		cin >> d;
		vec.pb(d);
		if(d==0)break;
		cin >> n;
		cin >> m;
		for(int i=0;i<n-1;i++)
		{
			int k;
			cin >> k;
			vec.pb(k);
		}
		SORT(vec);
		int ans=0;
		for(int i=0;i<m;i++)
		{
			int k;
			cin >> k;
			vector<int>::iterator it;
			it=lower_bound(all(vec),k);
			int p1=(*it);
			it--;
			int p2=(*it);
			ans+=min(abs(p1-k),abs(p2-k));
		}
		cout << ans << endl;
	}
	return 0;
}