complete 1660.rs 5242.rs 8406.rs 14024.rs
This commit is contained in:
63
storage/jungol/rs/completed/8406.rs
Normal file
63
storage/jungol/rs/completed/8406.rs
Normal file
@@ -0,0 +1,63 @@
|
||||
use std::io::{read_to_string, stdin};
|
||||
|
||||
struct ReligionState {
|
||||
parents: Vec<usize>,
|
||||
counts: Vec<usize>,
|
||||
}
|
||||
|
||||
impl ReligionState {
|
||||
fn find(&self, x: usize) -> usize {
|
||||
let mut node = x;
|
||||
while (node != self.parents[node]) {
|
||||
node = self.parents[node];
|
||||
}
|
||||
return node;
|
||||
}
|
||||
|
||||
fn sames(&self, x: usize) -> usize {
|
||||
return self.counts[self.find(x)];
|
||||
}
|
||||
|
||||
fn unite(&mut self, x: usize, y: usize) {
|
||||
let rx = self.find(x);
|
||||
let ry = self.find(y);
|
||||
|
||||
if rx < ry {
|
||||
self.parents[ry] = rx;
|
||||
self.counts[rx] += self.counts[ry];
|
||||
} else if rx > ry {
|
||||
self.parents[rx] = ry;
|
||||
self.counts[ry] += self.counts[rx]
|
||||
} else {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let temp = read_to_string(stdin()).unwrap();
|
||||
let mut iter = temp
|
||||
.split_ascii_whitespace()
|
||||
.map(|x| x.parse::<usize>().unwrap());
|
||||
|
||||
let n = iter.next().unwrap();
|
||||
let q = iter.next().unwrap();
|
||||
|
||||
let mut parents = (0..n).map(|i| i).collect::<Vec<_>>();
|
||||
|
||||
let mut S = ReligionState {
|
||||
parents,
|
||||
counts: (0..n).map(|_| 1).collect(),
|
||||
};
|
||||
|
||||
for _ in 0..q {
|
||||
let query = iter.next().unwrap();
|
||||
if (query == 1) {
|
||||
let (x, y) = (iter.next().unwrap() - 1, iter.next().unwrap() - 1);
|
||||
|
||||
S.unite(x, y);
|
||||
} else {
|
||||
let x = iter.next().unwrap() - 1;
|
||||
println!("{}", S.sames(x));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user