Submission #60559108


Source Code Expand

#[allow(unused_imports)]
use itertools::Itertools;
use proconio::{input, marker::Usize1};

fn main() {
    input!{
        n: usize,
        m: usize,
        k: usize,
        e: [(Usize1, Usize1, u64); m],
        a: [Usize1; k],
        b: [Usize1; k],
    }
    let mut ans = 0;
    let f = |x: &(u64, u64), y: &(u64, u64)| {
        let a = x.0 + y.0;
        let b = x.1 + y.1;
        if a > b {
            (a - b, 0)
        } else {
            (0, b - a)
        }
    };

    let mut uf = UnionFind::new(n, f);

    let va = a.iter().fold(vec![0; n], |mut v, &ai| { v[ai]+=1; v });
    let vb = b.iter().fold(vec![0; n], |mut v, &ai| { v[ai]+=1; v });
    for i in 0..n {
        uf.insert_data(i, (va[i], vb[i]));
    }

    for &(u, v, w) in e.iter().sorted_unstable_by_key(|v| v.2) {
        if uf.same(u, v) {
            continue;
        }
        let (pa, pb) = uf.get_data(u).copied().unwrap();
        let (qa, qb) = uf.get_data(v).copied().unwrap();
        let val = (pa+qa).min(pb+qb);
        ans += val * w;
        uf.merge(u, v);
    }
    println!("{}", ans);
}

pub trait Debuggable {
    fn debug_string(&self) -> String;
}

impl<T: std::fmt::Debug + std::fmt::Display> Debuggable for Vec<T> {
    fn debug_string(&self) -> String {
        use itertools::Itertools;
        use std::iter::repeat;
        if let Some(max_size) = self.iter()
            .map(|x| format!("{:?}", x).len())
            .max() {
                let mut idx = String::from("idx |");   
                let mut val = String::from("val |");   
                for (i, xi) in self.iter().enumerate() {
                    idx.push_str(
                        &format!(" {:>w$} |", i, w=max_size)
                    );
                    val.push_str(
                        &format!(" {:>w$} |", xi, w=max_size)
                    );
                }

                format!("{}\n{}\n{}\n", idx, repeat('-').take(idx.len()).join(""), val)
            } else {
                format!("idx | \nval |\n")
            }
    }
}

impl<T: std::fmt::Debug + std::fmt::Display> Debuggable for std::collections::BTreeSet<T> {
    fn debug_string(&self) -> String {
        use itertools::Itertools;
        format!("{{ {} }}", self.iter().join(", "))
    }
}

impl<T, U> Debuggable for std::collections::BTreeMap<T, U> 
where T: std::fmt::Debug + std::fmt::Display, U: std::fmt::Debug + std::fmt::Display
{
    fn debug_string(&self) -> String {
        use itertools::Itertools;
        format!(
            "{{\n{}\n }}", self.iter()
                .map(|(k, v)| format!("{k} -> {v}, "))
                .join("\n")
        )
    }
}

// lg! マクロの定義
#[macro_export]
macro_rules! lg {
    ($val:expr) => {
        #[cfg(feature = "local")]
        {
            {
                use Debuggable;
                let val = &$val;
                eprintln!(
                    "[{}:{}] {} = \n{}",
                    file!(),
                    line!(),
                    stringify!($val),
                    val.debug_string()
                );
                val
            }
        }
    }
}
    #[derive(Debug)]
pub struct UnionFind<T, F>
where F: Fn(&T, &T) -> T,
{
    vertex: Vec<usize>,
    data: Vec<Option<T>>,
    merge_op: F,
}

impl<T: Clone, F: Fn(&T, &T) -> T> UnionFind<T, F> {
    pub fn new(size: usize, merge_op: F) -> Self {
        UnionFind {
            vertex: vec![!1; size] ,
            data: vec![None; size],
            merge_op,
        }
    }

    pub fn leader(&mut self, u: usize) -> usize {
        let elm: usize = self.vertex[u];
        if elm > self.vertex.len() {
            // 親ノードなので返却
            u
        } else {
            // 子ノードなので親ノードを取得したのち、圧縮
            self.vertex[u] = self.leader(elm);
            self.vertex[u]
        }
    }

    pub fn same(&mut self, u: usize, v: usize) -> bool {
        self.leader(u) == self.leader(v)
    }

    pub fn size(&mut self, u: usize) -> usize {
        let idx: usize = self.leader(u);
        !self.vertex[idx]
    }

    pub fn merge(&mut self, u: usize, v: usize) -> bool {
        if self.same(u, v) {
            // すでに親が同じ場合は何もせず、「マージされなかった」ことを報告
            return false;
        }
        let u_leader = self.leader(u);
        let u_size = self.size(u);

        let v_leader = self.leader(v);
        let v_size = self.size(v);

        let merged_size = !(u_size + v_size);
        if u_size < v_size {
            self.vertex[v_leader] = merged_size;
            self.vertex[u_leader] = v_leader;

            self.data[v_leader] = match (&self.data[u_leader], &self.data[v_leader]) {
                (Some(du), Some(dv)) => Some((self.merge_op)(du, dv)),
                (None, None) => None,
                _ => { unreachable!(); }
            };
        } else {
            self.vertex[u_leader] = merged_size;
            self.vertex[v_leader] = u_leader;

            self.data[u_leader] = match (&self.data[u_leader], &self.data[v_leader]) {
                (Some(du), Some(dv)) => Some((self.merge_op)(du, dv)),
                (None, None) => None,
                _ => { unreachable!(); }
            };
        }

        true
    }

    pub fn insert_data(&mut self, u: usize, value: T) {
        let root = self.leader(u);
        self.data[root] = Some(value);
    }

    pub fn get_data(&mut self, u: usize) -> Option<&T> {
        let root = self.leader(u);
        self.data[root].as_ref()
    }

}

Submission Info

Submission Time
Task E - Sum of Max Matching
User ardRiriy
Language Rust (rustc 1.70.0)
Score 500
Code Size 5576 Byte
Status AC
Exec Time 56 ms
Memory 27804 KiB

Compile Error

warning: the item `Itertools` is imported redundantly
  --> src/main.rs:52:13
   |
2  | use itertools::Itertools;
   |     -------------------- the item `Itertools` is already imported here
...
52 |         use itertools::Itertools;
   |             ^^^^^^^^^^^^^^^^^^^^
   |
   = note: `#[warn(unused_imports)]` on by default

warning: the item `Itertools` is imported redundantly
  --> src/main.rs:77:13
   |
2  | use itertools::Itertools;
   |     -------------------- the item `Itertools` is already imported here
...
77 |         use itertools::Itertools;
   |             ^^^^^^^^^^^^^^^^^^^^

warning: the item `Itertools` is imported redundantly
  --> src/main.rs:86:13
   |
2  | use itertools::Itertools;
   |     -------------------- the item `Itertools` is already imported here
...
86 |         use itertools::Itertools;
   |             ^^^^^^^^^^^^^^^^^^^^

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 500 / 500
Status
AC × 2
AC × 42
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt
All 00_sample_00.txt, 00_sample_01.txt, 01_test_00.txt, 01_test_01.txt, 01_test_02.txt, 01_test_03.txt, 01_test_04.txt, 01_test_05.txt, 01_test_06.txt, 01_test_07.txt, 01_test_08.txt, 01_test_09.txt, 01_test_10.txt, 01_test_11.txt, 01_test_12.txt, 01_test_13.txt, 01_test_14.txt, 01_test_15.txt, 01_test_16.txt, 01_test_17.txt, 01_test_18.txt, 01_test_19.txt, 01_test_20.txt, 01_test_21.txt, 01_test_22.txt, 01_test_23.txt, 01_test_24.txt, 01_test_25.txt, 01_test_26.txt, 01_test_27.txt, 01_test_28.txt, 01_test_29.txt, 01_test_30.txt, 01_test_31.txt, 01_test_32.txt, 01_test_33.txt, 01_test_34.txt, 01_test_35.txt, 01_test_36.txt, 01_test_37.txt, 01_test_38.txt, 01_test_39.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 0 ms 1892 KiB
00_sample_01.txt AC 0 ms 1980 KiB
01_test_00.txt AC 0 ms 1888 KiB
01_test_01.txt AC 1 ms 2000 KiB
01_test_02.txt AC 1 ms 1932 KiB
01_test_03.txt AC 17 ms 8568 KiB
01_test_04.txt AC 4 ms 3532 KiB
01_test_05.txt AC 1 ms 2216 KiB
01_test_06.txt AC 4 ms 4052 KiB
01_test_07.txt AC 1 ms 1948 KiB
01_test_08.txt AC 28 ms 13764 KiB
01_test_09.txt AC 44 ms 21924 KiB
01_test_10.txt AC 19 ms 12012 KiB
01_test_11.txt AC 21 ms 13100 KiB
01_test_12.txt AC 4 ms 3664 KiB
01_test_13.txt AC 10 ms 6656 KiB
01_test_14.txt AC 31 ms 19908 KiB
01_test_15.txt AC 41 ms 25488 KiB
01_test_16.txt AC 47 ms 23028 KiB
01_test_17.txt AC 52 ms 26108 KiB
01_test_18.txt AC 45 ms 26896 KiB
01_test_19.txt AC 38 ms 23368 KiB
01_test_20.txt AC 47 ms 23480 KiB
01_test_21.txt AC 50 ms 25012 KiB
01_test_22.txt AC 39 ms 22512 KiB
01_test_23.txt AC 43 ms 24464 KiB
01_test_24.txt AC 56 ms 27692 KiB
01_test_25.txt AC 54 ms 27732 KiB
01_test_26.txt AC 55 ms 27784 KiB
01_test_27.txt AC 53 ms 27804 KiB
01_test_28.txt AC 52 ms 27680 KiB
01_test_29.txt AC 22 ms 11476 KiB
01_test_30.txt AC 22 ms 11516 KiB
01_test_31.txt AC 23 ms 11528 KiB
01_test_32.txt AC 53 ms 25344 KiB
01_test_33.txt AC 51 ms 25452 KiB
01_test_34.txt AC 53 ms 26088 KiB
01_test_35.txt AC 38 ms 26208 KiB
01_test_36.txt AC 32 ms 25752 KiB
01_test_37.txt AC 27 ms 24164 KiB
01_test_38.txt AC 46 ms 24828 KiB
01_test_39.txt AC 0 ms 1784 KiB