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
2024-12-08 11:49:13+0900
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
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