結果
問題 | No.168 ものさし |
ユーザー |
|
提出日時 | 2016-09-07 16:56:05 |
言語 | D (dmd 2.109.1) |
結果 |
AC
|
実行時間 | 300 ms / 2,000 ms |
コード長 | 1,539 bytes |
コンパイル時間 | 975 ms |
コンパイル使用メモリ | 137,232 KB |
実行使用メモリ | 30,576 KB |
最終ジャッジ日時 | 2024-06-12 04:13:22 |
合計ジャッジ時間 | 3,656 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 19 |
ソースコード
import std.algorithm, std.array, std.container, std.range, std.bitmanip;import std.numeric, std.math, std.bigint, std.random, core.bitop;import std.string, std.regex, std.conv, std.stdio, std.typecons;class UnionFind {size_t[] par;this(size_t n) {par = new size_t[](n);par[] = size_t.max;}size_t find(size_t i) {if (par[i] == size_t.max) {return i;} else {par[i] = find(par[i]);return par[i];}}void unite(size_t i, size_t j) {auto pi = find(i), pj = find(j);if (pi != pj) par[pj] = pi;}}struct point {long x, y;point opBinary(string op)(point rhs) {static if (op == "+") return point(x + rhs.x, y + rhs.y);else static if (op == "-") return point(x - rhs.x, y - rhs.y);}}alias Tuple!(size_t, "i", size_t, "j", long, "len") bet;void main(){auto n = readln.chomp.to!size_t;auto pi = iota(n).map!(_ => readln.split.map!(to!long)).map!(rd => point(rd[0], rd[1])).array;bet[] bi;foreach (i; 0..n - 1)foreach (j; i + 1..n)bi ~= bet(i, j, rulerLen(pi[i], pi[j]));bi.sort!("a.len < b.len");auto uf = new UnionFind(n);foreach (b; bi) {uf.unite(b.i, b.j);if (uf.find(0) == uf.find(n - 1)) {writeln(b.len);break;}}}long rulerLen(point p1, point p2){auto p = p1 - p2;auto a = p.x ^^ 2 + p.y ^^ 2;bool calc(long _, long b) {return b ^^ 2 >= a;}return iota(10L, a.to!real.sqrt.to!long * 2, 10L).assumeSorted!(calc).upperBound(0).front;}