提出 #34127397


ソースコード 拡げる

use proconio::{fastout, input};
use union_find::*;

pub mod union_find {

    #[derive(Debug, Clone)]
    pub struct UnionFind {
        par: Vec<usize>,
        size: Vec<usize>,
    }

    impl UnionFind {
        pub fn new(n: usize) -> Self {
            Self {
                par: vec![0; n],
                size: vec![1; n],
            }
        }

        pub fn find_root(&mut self, a: usize) -> usize {
            if self.size[a] > 0 {
                return a;
            }
            self.par[a] = self.find_root(self.par[a]);
            self.par[a]
        }

        pub fn union(&mut self, a: usize, b: usize) -> usize {
            let mut x = self.find_root(a);
            let mut y = self.find_root(b);
            if x == y {
                return x;
            }
            if self.size[x] < self.size[y] {
                std::mem::swap(&mut x, &mut y);
            }
            self.size[x] += self.size[y];
            self.size[y] = 0;
            self.par[y] = x;
            x
        }

        pub fn in_same_set(&mut self, a: usize, b: usize) -> bool {
            self.find_root(a) == self.find_root(b)
        }

        pub fn group_size(&mut self, a: usize) -> usize {
            let x = self.find_root(a);
            self.size[x]
        }
    }
}

fn f(xy: &Vec<(i64, i64)>, n: usize, r: f64) -> bool {
    // n: y=-100, n+1: y=100
    let mut uf = UnionFind::new(xy.len() + 2);
    for i in 0..n {
        let (_, y) = xy[i];
        let y = y as f64;
        if y - 2.0 * r < -100.0 {
            uf.union(i, n);
        }
        if y + 2.0 * r > 100.0 {
            uf.union(i, n + 1);
        }
    }

    for i in 0..n - 1 {
        let (x0, y0) = xy[i];
        let x0 = x0 as f64;
        let y0 = y0 as f64;
        for j in i + 1..n {
            let (x1, y1) = xy[j];
            let x1 = x1 as f64;
            let y1 = y1 as f64;
            let dx = x1 - x0;
            let dy = y1 - y0;
            if dx * dx + dy * dy < 4.0 * r * r {
                uf.union(i, j);
            }
        }
    }

    !uf.in_same_set(n, n + 1)
}

#[fastout]
fn main() {
    input! {
        n: usize,
        xy: [(i64, i64); n],
    }

    // bisect
    let mut l = 0.0;
    let mut r = 100.0;
    for _ in 0..100 {
        let mid = (l + r) / 2.0;
        if f(&xy, n, mid) {
            l = mid;
        } else {
            r = mid;
        }
    }

    println!("{}", r);
}

提出情報

提出日時
問題 F - Silver Woods
ユーザ matsueushi
言語 Rust (1.42.0)
得点 600
コード長 2428 Byte
結果 AC
実行時間 14 ms
メモリ 2212 KiB

ジャッジ結果

セット名 Sample All
得点 / 配点 0 / 0 600 / 600
結果
AC × 4
AC × 56
セット名 テストケース
Sample sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
All hand_01.txt, random_01_small.txt, random_02_small.txt, random_03_small.txt, random_04_small.txt, random_05_small.txt, random_06_small.txt, random_07_small.txt, random_08_small.txt, random_09_small.txt, random_10_small.txt, random_11_small.txt, random_12_small.txt, random_13_small.txt, random_14_small.txt, random_15_small.txt, random_16_large.txt, random_17_large.txt, random_18_large.txt, random_19_large.txt, random_20_large.txt, random_21_large.txt, random_22_large.txt, random_23_large.txt, random_24_large.txt, random_25_large.txt, random_26_max.txt, random_27_max.txt, random_28_max.txt, random_29_max.txt, random_30_max.txt, random_31_max.txt, random_32_max.txt, random_33_max.txt, random_34_max.txt, random_35_max.txt, random_36_max.txt, random_37_max.txt, random_38_max.txt, random_39_max.txt, random_40_max.txt, random_41_max.txt, random_42_max.txt, random_43_max.txt, random_44_max.txt, random_45_max.txt, random_46_lattice.txt, random_47_lattice.txt, random_48_lattice.txt, random_49_lattice.txt, random_50_lattice.txt, random_51_lattice.txt, sample_01.txt, sample_02.txt, sample_03.txt, sample_04.txt
ケース名 結果 実行時間 メモリ
hand_01.txt AC 8 ms 2180 KiB
random_01_small.txt AC 2 ms 1968 KiB
random_02_small.txt AC 2 ms 2184 KiB
random_03_small.txt AC 2 ms 2072 KiB
random_04_small.txt AC 2 ms 2104 KiB
random_05_small.txt AC 2 ms 2072 KiB
random_06_small.txt AC 2 ms 2056 KiB
random_07_small.txt AC 2 ms 2172 KiB
random_08_small.txt AC 1 ms 2064 KiB
random_09_small.txt AC 2 ms 2064 KiB
random_10_small.txt AC 2 ms 2028 KiB
random_11_small.txt AC 1 ms 2096 KiB
random_12_small.txt AC 1 ms 2056 KiB
random_13_small.txt AC 1 ms 2072 KiB
random_14_small.txt AC 2 ms 2080 KiB
random_15_small.txt AC 2 ms 2148 KiB
random_16_large.txt AC 2 ms 2096 KiB
random_17_large.txt AC 3 ms 2148 KiB
random_18_large.txt AC 2 ms 2000 KiB
random_19_large.txt AC 2 ms 2068 KiB
random_20_large.txt AC 2 ms 2000 KiB
random_21_large.txt AC 2 ms 2176 KiB
random_22_large.txt AC 2 ms 2188 KiB
random_23_large.txt AC 2 ms 2172 KiB
random_24_large.txt AC 2 ms 2132 KiB
random_25_large.txt AC 2 ms 2204 KiB
random_26_max.txt AC 6 ms 2212 KiB
random_27_max.txt AC 6 ms 2156 KiB
random_28_max.txt AC 8 ms 2104 KiB
random_29_max.txt AC 5 ms 2152 KiB
random_30_max.txt AC 5 ms 2052 KiB
random_31_max.txt AC 4 ms 2136 KiB
random_32_max.txt AC 6 ms 2068 KiB
random_33_max.txt AC 5 ms 2080 KiB
random_34_max.txt AC 5 ms 2108 KiB
random_35_max.txt AC 5 ms 2192 KiB
random_36_max.txt AC 7 ms 2180 KiB
random_37_max.txt AC 14 ms 2076 KiB
random_38_max.txt AC 6 ms 2188 KiB
random_39_max.txt AC 4 ms 2092 KiB
random_40_max.txt AC 4 ms 2076 KiB
random_41_max.txt AC 3 ms 2120 KiB
random_42_max.txt AC 6 ms 1976 KiB
random_43_max.txt AC 7 ms 2008 KiB
random_44_max.txt AC 5 ms 2016 KiB
random_45_max.txt AC 6 ms 2080 KiB
random_46_lattice.txt AC 6 ms 2096 KiB
random_47_lattice.txt AC 3 ms 2192 KiB
random_48_lattice.txt AC 4 ms 2068 KiB
random_49_lattice.txt AC 2 ms 2136 KiB
random_50_lattice.txt AC 3 ms 2104 KiB
random_51_lattice.txt AC 2 ms 2008 KiB
sample_01.txt AC 2 ms 2112 KiB
sample_02.txt AC 2 ms 2000 KiB
sample_03.txt AC 2 ms 2188 KiB
sample_04.txt AC 2 ms 2148 KiB