結果
問題 | No.1843 Tree ANDistance |
ユーザー |
|
提出日時 | 2022-02-18 22:46:37 |
言語 | Rust (1.83.0 + proconio) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,730 bytes |
コンパイル時間 | 13,298 ms |
コンパイル使用メモリ | 377,780 KB |
実行使用メモリ | 5,932 KB |
最終ジャッジ日時 | 2024-06-29 09:32:46 |
合計ジャッジ時間 | 17,284 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 9 WA * 29 |
ソースコード
// https://qiita.com/tanakh/items/0ba42c7ca36cd29d0ac8macro_rules! input {($($r:tt)*) => {let stdin = std::io::stdin();let mut bytes = std::io::Read::bytes(std::io::BufReader::new(stdin.lock()));let mut next = move || -> String{bytes.by_ref().map(|r|r.unwrap() as char).skip_while(|c|c.is_whitespace()).take_while(|c|!c.is_whitespace()).collect()};input_inner!{next, $($r)*}};}macro_rules! input_inner {($next:expr) => {};($next:expr,) => {};($next:expr, $var:ident : $t:tt $($r:tt)*) => {let $var = read_value!($next, $t);input_inner!{$next $($r)*}};}macro_rules! read_value {($next:expr, ( $($t:tt),* )) => { ($(read_value!($next, $t)),*) };($next:expr, [ $t:tt ; $len:expr ]) => {(0..$len).map(|_| read_value!($next, $t)).collect::<Vec<_>>()};($next:expr, usize1) => (read_value!($next, usize) - 1);($next:expr, $t:ty) => ($next().parse::<$t>().expect("Parse error"));}/*** Union-Find tree.* Verified by https://atcoder.jp/contests/pakencamp-2019-day3/submissions/9253305*/struct UnionFind { disj: Vec<usize>, rank: Vec<usize> }impl UnionFind {fn new(n: usize) -> Self {let disj = (0..n).collect();UnionFind { disj: disj, rank: vec![1; n] }}fn root(&mut self, x: usize) -> usize {if x != self.disj[x] {let par = self.disj[x];let r = self.root(par);self.disj[x] = r;}self.disj[x]}fn unite(&mut self, x: usize, y: usize) {let mut x = self.root(x);let mut y = self.root(y);if x == y { return }if self.rank[x] > self.rank[y] {std::mem::swap(&mut x, &mut y);}self.disj[x] = y;self.rank[y] += self.rank[x];}#[allow(unused)]fn is_same_set(&mut self, x: usize, y: usize) -> bool {self.root(x) == self.root(y)}#[allow(unused)]fn size(&mut self, x: usize) -> usize {let x = self.root(x);self.rank[x]}}const MOD: i64 = 1_000_000_007;fn main() {input! {n: usize,abc: [(usize1, usize1, i64); n - 1],}let mut tot = 0;for k in 0..30 {let mut uf = UnionFind::new(n);for &(a, b, c) in &abc {if (c & 1 << k) != 0 {uf.unite(a, b);}}for i in 0..n {if uf.root(i) == i {let s = uf.size(i) as i64;let v = s * (s - 1) / 2 % MOD;tot += (v << k) % MOD;}}}println!("{}", tot);}