rustgym 0.2.0

rustgym solutions
Documentation
struct Solution;

struct UnionFind {
    parent: Vec<usize>,
    n: usize,
}

impl UnionFind {
    fn new(n: usize) -> Self {
        let parent = (0..n).collect();
        UnionFind { parent, n }
    }

    fn find(&mut self, i: usize) -> usize {
        let j = self.parent[i];
        if i == j {
            i
        } else {
            let k = self.find(j);
            self.parent[i] = k;
            k
        }
    }

    fn union(&mut self, mut i: usize, mut j: usize) {
        i = self.find(i);
        j = self.find(j);
        if i != j {
            self.parent[i] = j;
            self.n -= 1;
        }
    }
}

impl Solution {
    fn are_connected(n: i32, threshold: i32, queries: Vec<Vec<i32>>) -> Vec<bool> {
        let mut uf = UnionFind::new(n as usize);
        for i in threshold + 1..n {
            let mut group = vec![];
            for j in 1..=n {
                if j % i == 0 {
                    group.push((j - 1) as usize);
                }
            }
            for w in group.windows(2) {
                uf.union(w[0], w[1]);
            }
        }
        let mut res = vec![];
        for q in queries {
            let a = uf.find((q[0] - 1) as usize);
            let b = uf.find((q[1] - 1) as usize);
            res.push(a == b)
        }
        res
    }
}

#[test]
fn test() {
    let n = 6;
    let threshold = 2;
    let queries = vec_vec_i32![[1, 4], [2, 5], [3, 6]];
    let res = vec![false, false, true];
    assert_eq!(Solution::are_connected(n, threshold, queries), res);
    let n = 6;
    let threshold = 0;
    let queries = vec_vec_i32![[4, 5], [3, 4], [3, 2], [2, 6], [1, 3]];
    let res = vec![true, true, true, true, true];
    assert_eq!(Solution::are_connected(n, threshold, queries), res);
    let n = 5;
    let threshold = 1;
    let queries = vec_vec_i32![[4, 5], [4, 5], [3, 2], [2, 3], [3, 4]];
    let res = vec![false, false, false, false, false];
    assert_eq!(Solution::are_connected(n, threshold, queries), res);
}