結果
問題 | No.168 ものさし |
ユーザー |
![]() |
提出日時 | 2017-08-19 01:49:43 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 283 ms / 2,000 ms |
コード長 | 1,893 bytes |
コンパイル時間 | 714 ms |
コンパイル使用メモリ | 106,192 KB |
実行使用メモリ | 6,944 KB |
最終ジャッジ日時 | 2024-06-12 21:40:40 |
合計ジャッジ時間 | 3,369 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 19 |
ソースコード
import std.algorithm;import std.array;import std.conv;import std.math;import std.range;import std.stdio;import std.string;import std.typecons;int readint() {return readln.chomp.to!int;}int[] readints() {return readln.split.map!(to!int).array;}bool can(long len, long[][] ps) {int n = cast(int) ps.length;auto uf = new UnionFind(n);for (int i = 0; i < n; i++) {for (int j = i + 1; j < n; j++) {long x1 = ps[i][0];long y1 = ps[i][1];long x2 = ps[j][0];long y2 = ps[j][1];long d = (x1 - x2) ^^ 2 + (y1 - y2) ^^ 2;if (len * len >= d) {uf.unite(i, j);}}}return uf.isSame(0, n - 1);}long calc(long[][] ps) {long ans = long.max;long lo = 1;long hi = 2_000_000_000L;while (lo <= hi) {long m = (lo + hi) / 2;if (can(m * 10, ps)) {ans = min(ans, m);hi = m - 1;}else {lo = m + 1;}}return ans * 10;}void main() {long[][] ps;int n = readint();for (int i = 0; i < n; i++) {auto xy = readln.split.map!(to!long).array;ps ~= xy;}writeln(calc(ps));}class UnionFind {private int[] _data;this(int n) {_data = new int[](n + 1);_data[] = -1;}int root(int a) {if (_data[a] < 0)return a;return _data[a] = root(_data[a]);}bool unite(int a, int b) {int rootA = root(a);int rootB = root(b);if (rootA == rootB)return false;_data[rootA] += _data[rootB];_data[rootB] = rootA;return true;}bool isSame(int a, int b) {return root(a) == root(b);}int size(int a) {return -_data[root(a)];}}