Problem:
問題 ４

　平面上の n 個の点 P1, ..., Pn が与えられたとき，
距離が最小の２点を求めたい．

　入力ファイルの１行目には整数 n が書いてある．
２行目から n+1 行目のそれぞれには，
２つの正整数 x, y が１つの半角空白文字を区切りとして書いてある．
i+1 行目の x, y はそれぞれ Pi の x 座標，
Pi の y 座標である．
これら n 点の中から最も近い２点を選んだとき，
この２点間の距離の２乗を出力せよ．

　ただし，
2≤n≤500000 かつ -10000≤x≤10000, -10000≤y≤10000 とし，
５つの入力ファイルのうち３つでは n≤100 である．
また，どの入力ファイルにおいても，全ての座標は異なるものとする．

出力ファイルにおいては，
出力の最後の行にも改行コードを入れること．

入出力例

入力例１

2
0 0
1 1

出力例１

2

入力例２

3
5 5
0 0
-3 -4

出力例２

25

問題文と自動審判に使われるデータは、情報オリンピック日本委員会が作成し公開している問題文と採点用テストデータです。

Solution in JAVA (judge verdict: Accepted)

import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;

public class Main {
	public static void main(String[] args){
		Scanner sc = new Scanner(System.in);
		// 全ての点を読み込む
		int n = sc.nextInt();
		long[][] points = new long[n][2];
		for (int i = 0; i < n; i++) {
			points[i][0] = sc.nextInt();
			points[i][1] = sc.nextInt();
		}
		// xの値でソート
		Arrays.sort(points, new Comparator<long[]>(){
			@Override
			public int compare(long[] p1, long[] p2) {
				return Long.compare(p1[0], p2[0]);
			}
		});
		// 初期の最大値
		double l = Float.MAX_VALUE;
		long sq = Long.MAX_VALUE;
		for (int i = 0; i < n; i++) {
			for (int j = i + 1; j < n; j++){
				long[] p1 = points[i];
				long[] p2 = points[j];
				if (p2[0] - p1[0] > l) break;
				long dx = p2[0] - p1[0];
				long dy = p2[1] - p1[1];
				long sq_tmp = dx * dx + dy * dy;
				if (sq_tmp < sq) {
					sq = sq_tmp;
					l = Math.sqrt(sq);
				}
			}
		}
		System.out.println(sq);
	}
}