UVa 10245: The Closest Pair Problem

UVa Online Judge

蟻本にO(NlogN)になる理由などは述べられている。

実装だが、ここが本当にうまいと思った。

//a is sorted by x coordinate
int m = n / 2;
double x = a[m].fst;
double d = min(closest_pair(a, m), closest_pair(a + m, n - m));
inplace_merge(a, a + m, a + n, compare_y);

xの昇順で真ん中のところに線を引きながら、yの座標でmerge sortを行っている。
これをすることで愚直にsortするとO(Nlog^2N)になるところを改善している。ほかの問題にも応用できそうだ。

あとinplace_mergeというのを使っているが、これがまさにmerge sortを行っている部分。
compare_yという関数を引数にしているが、これは単なるmergeでも指定できる。

mergeといえばデータ構造をマージする際の一般的なテクニックだが、使ったことがないので学習しておきたい。