diff --git a/Cargo.lock b/Cargo.lock index 4f7d2c1..1369cc5 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -100,6 +100,7 @@ dependencies = [ "superslice 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", "take_mut 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", "text_io 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", + "union-find 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", "whiteread 0.5.0 (registry+https://github.com/rust-lang/crates.io-index)", ] @@ -998,6 +999,11 @@ name = "unicode-xid" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +[[package]] +name = "union-find" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + [[package]] name = "version_check" version = "0.1.5" @@ -1157,6 +1163,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum unicode-segmentation 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e83e153d1053cbb5a118eeff7fd5be06ed99153f00dbcd8ae310c5fb2b22edc0" "checksum unicode-xid 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fc72304796d0818e357ead4e000d19c9c174ab23dc11093ac919054d20a6a7fc" "checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" +"checksum union-find 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ded8a2ba8917ff7a977a446770a8c3bfec18e147b5617b41fd8aae703d8c6720" "checksum version_check 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "914b1a6776c4c929a602fafd8bc742e06365d4bcbe48c30f9cca5824f70dc9dd" "checksum version_check 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce" "checksum wasi 0.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b89c3ce4ce14bdc6fb6beaf9ec7928ca331de5df7e5ea278375642a2f478570d" diff --git a/Cargo.toml b/Cargo.toml index a539a9e..5ca8954 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -133,6 +133,9 @@ im-rc = "=14.0.0" fixedbitset = "=0.2.0" bitset-fixed = "=0.1.0" +# union-find (a.k.a. disjoint-set) +union-find = "=0.3.2" + # 競技プログラミングの入出力サポート proconio = { version = "=0.3.4", features = ["derive"] } text_io = "=0.1.7" diff --git a/examples/abc120-d.rs b/examples/abc120-d.rs new file mode 100644 index 0000000..27810d2 --- /dev/null +++ b/examples/abc120-d.rs @@ -0,0 +1,29 @@ +// https://atcoder.jp/contests/abc120/tasks/abc120_d + +use proconio::marker::Usize1; +use proconio::{fastout, input}; +use union_find::{QuickFindUf, UnionBySize, UnionFind as _}; + +#[fastout] +fn main() { + input! { + n: usize, + m: usize, + abs: [(Usize1, Usize1); m], + } + + let mut u = QuickFindUf::::new(n); + let mut k = n * (n - 1) / 2; + let mut r = vec![k]; + r.extend(abs.into_iter().rev().map(|(a, b)| { + let p = u.get(a).size() * u.get(b).size(); + if u.union(a, b) { + k -= p; + } + k + })); + assert_eq!(r.pop(), Some(0)); + for r in r.into_iter().rev() { + println!("{}", r); + } +} diff --git a/examples/tests.ron b/examples/tests.ron index 445367d..2b4f9ab 100644 --- a/examples/tests.ron +++ b/examples/tests.ron @@ -12,5 +12,9 @@ name: "ABC049 / ARC065: C - 白昼夢 / Daydream", matching: ExactWords, ), + "abc120-d": ( + name: "ABC120: D - Decayed Bridges ", + matching: ExactWords, + ), } ) diff --git a/examples/testsets/abc120-d/in/sample_01.txt b/examples/testsets/abc120-d/in/sample_01.txt new file mode 100644 index 0000000..8881ee2 --- /dev/null +++ b/examples/testsets/abc120-d/in/sample_01.txt @@ -0,0 +1,6 @@ +4 5 +1 2 +3 4 +1 3 +2 3 +1 4 diff --git a/examples/testsets/abc120-d/in/sample_02.txt b/examples/testsets/abc120-d/in/sample_02.txt new file mode 100644 index 0000000..23a7d58 --- /dev/null +++ b/examples/testsets/abc120-d/in/sample_02.txt @@ -0,0 +1,6 @@ +6 5 +2 3 +1 2 +5 6 +3 4 +4 5 diff --git a/examples/testsets/abc120-d/in/sample_03.txt b/examples/testsets/abc120-d/in/sample_03.txt new file mode 100644 index 0000000..c9fa102 --- /dev/null +++ b/examples/testsets/abc120-d/in/sample_03.txt @@ -0,0 +1,2 @@ +2 1 +1 2 diff --git a/examples/testsets/abc120-d/out/sample_01.txt b/examples/testsets/abc120-d/out/sample_01.txt new file mode 100644 index 0000000..ce56183 --- /dev/null +++ b/examples/testsets/abc120-d/out/sample_01.txt @@ -0,0 +1,5 @@ +0 +0 +4 +5 +6 diff --git a/examples/testsets/abc120-d/out/sample_02.txt b/examples/testsets/abc120-d/out/sample_02.txt new file mode 100644 index 0000000..83dd8d4 --- /dev/null +++ b/examples/testsets/abc120-d/out/sample_02.txt @@ -0,0 +1,5 @@ +8 +9 +12 +14 +15 diff --git a/examples/testsets/abc120-d/out/sample_03.txt b/examples/testsets/abc120-d/out/sample_03.txt new file mode 100644 index 0000000..d00491f --- /dev/null +++ b/examples/testsets/abc120-d/out/sample_03.txt @@ -0,0 +1 @@ +1 diff --git a/tools/test-with-generated-opts/src/main.rs b/tools/test-with-generated-opts/src/main.rs index 0928fc7..f78d031 100644 --- a/tools/test-with-generated-opts/src/main.rs +++ b/tools/test-with-generated-opts/src/main.rs @@ -179,8 +179,7 @@ fn test(task_name: &str, matching: Matching, testsets: &Path, binary: &Path) -> .with_context(|| format!("Failed to execute {}", binary.display()))?; child.stdin.as_mut().unwrap().write_all(input.as_ref())?; - let status = child.wait()?; - let stop = Instant::now(); + child.stdin.take(); let actual = { let mut actual = "".to_owned(); child @@ -191,6 +190,8 @@ fn test(task_name: &str, matching: Matching, testsets: &Path, binary: &Path) -> .with_context(|| format!("{} outputted invalid UTF-8", binary.display()))?; actual }; + let status = child.wait()?; + let stop = Instant::now(); let time = (stop - start).as_millis(); let verdict = if status.success() && matching.accepts(&expected, &actual) {