Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
39 commits
Select commit Hold shift + click to select a range
ae428c9
add lca
cameroncuster May 16, 2024
5b0afc2
[auto-verifier] verify commit ae428c99ec55e3b6154c6c542691bf28a1a101f8
web-flow May 16, 2024
1b296f6
now lint with clippy
lrvideckis May 16, 2024
b0e7582
consistency
lrvideckis May 16, 2024
95393e1
asdf
lrvideckis May 16, 2024
3102f57
install verifyer helper tool later
lrvideckis May 16, 2024
19e3131
fix unused var
lrvideckis May 16, 2024
402a8e1
revert
lrvideckis May 16, 2024
0811fde
add back in clippy
lrvideckis May 16, 2024
f96bc61
fix clippy warnings
lrvideckis May 16, 2024
f1d2afd
[auto-verifier] verify commit f96bc61998b5a37eed6516d3ab3227ceee6ccbda
web-flow May 16, 2024
bc8f6ea
better way
lrvideckis May 16, 2024
c3564b0
[auto-verifier] verify commit bc8f6ea92b88bb1170c1c05508f5201f7b03cf4a
web-flow May 16, 2024
9ec9d52
now it ACs
lrvideckis May 16, 2024
73f202f
[auto-verifier] verify commit 9ec9d5210d03d93fd6daa480a9702a35e81c876a
web-flow May 16, 2024
ef40bd7
Merge branch 'clippy' into lca
lrvideckis May 16, 2024
4b235bf
here's some version which passes clippy
lrvideckis May 16, 2024
f8ffdd7
revert some
lrvideckis May 16, 2024
0ce105e
[auto-verifier] verify commit f8ffdd7269cde24f5b5940aa49f673da359a79f6
web-flow May 16, 2024
d7c0c42
fix clippy
lrvideckis May 16, 2024
efdc607
[auto-verifier] verify commit d7c0c42c4581731701124267ed46b00f1d25ce57
web-flow May 16, 2024
e0c25e9
remove todo
lrvideckis May 16, 2024
df31aaf
Merge branch 'lca' of github.com:programming-team-code/programming_te…
lrvideckis May 16, 2024
aca7ba2
[auto-verifier] verify commit df31aafbd258900f0bd3f41868d659766878a606
web-flow May 16, 2024
6ad2661
revert
lrvideckis May 17, 2024
22d5e9f
less diff
lrvideckis May 17, 2024
b4563c2
[auto-verifier] verify commit 22d5e9f94ebb001ed57865eb755ade115468702d
web-flow May 17, 2024
1f0e185
new CI file
lrvideckis May 17, 2024
d1e87f0
Merge branch 'clippy' of github.com:programming-team-code/programming…
lrvideckis May 17, 2024
15ead42
set up rust
lrvideckis May 17, 2024
930fbd7
[auto-verifier] verify commit 15ead42e262d353b13db9179ea46ad456cd281ce
web-flow May 17, 2024
2ab3b5a
increase time limit
lrvideckis May 17, 2024
13d63c5
only build as we use oj verify to test
lrvideckis May 17, 2024
2433dcc
[auto-verifier] verify commit 13d63c566e028510d520c77f8dbd6dbd7b80f6f1
web-flow May 17, 2024
00719c1
to test CI
lrvideckis May 17, 2024
6876e34
revert
lrvideckis May 17, 2024
f0d1fde
no longer keep timestamp file since all tests will run each time
lrvideckis May 17, 2024
163fa96
Merge branch 'clippy' into lca
lrvideckis May 17, 2024
0a0bd11
merge main
cameroncuster May 18, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions examples/lca.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
// verification-helper: PROBLEM https://judge.yosupo.jp/problem/lca

use proconio::input;
use programming_team_code_rust::lca::LCA;

fn main() {
input! {
n: usize,
q: usize,
p: [usize; n - 1],
queries: [(usize, usize); q],
}

let mut adj = vec![vec![]; n + n];
for (i, &parent) in p.iter().enumerate() {
adj[parent].push(i + 1);
adj[i + 1].push(parent);
adj[n + parent].push(n + i + 1);
}

let lca = LCA::new(&adj);
for (u, v) in queries {
let res = lca.lca(u, v);
let res_other = lca.lca(n + u, n + v) - n;
assert!(res == res_other);
println!("{}", res);
}
}
55 changes: 55 additions & 0 deletions src/lca.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
use crate::rmq::RMQ;

pub struct LCA {
tin: Vec<usize>,
p: Vec<Option<usize>>,
rmq: RMQ<(usize, usize)>,
}
impl LCA {
/// adj can be undirected tree, directed tree (rooted at node 0), or a forest of undirected
/// trees
pub fn new(adj: &Vec<Vec<usize>>) -> Self {
let n = adj.len();
let mut d = vec![0; n];
let mut tin = vec![0; n];
let mut p = vec![None; n];
let mut order = Vec::with_capacity(n);
fn dfs(
u: usize,
p: &mut Vec<Option<usize>>,
adj: &Vec<Vec<usize>>,
d: &mut Vec<usize>,
tin: &mut Vec<usize>,
order: &mut Vec<usize>,
) {
tin[u] = order.len();
order.push(u);
for &v in &adj[u] {
if p[u] != Some(v) {
d[v] = d[u] + 1;
p[v] = Some(u);
dfs(v, p, adj, d, tin, order);
}
}
}
for s in 0..n {
if p[s].is_none() {
dfs(s, &mut p, adj, &mut d, &mut tin, &mut order);
}
}
let d_with_order: Vec<(usize, usize)> = order.iter().map(|&u| (d[u], u)).collect();
let rmq = RMQ::new(&d_with_order, std::cmp::min);
LCA { tin, p, rmq }
}
/// gets the lowest common ancestor of u and v
pub fn lca(&self, u: usize, v: usize) -> usize {
if u == v {
return u;
}
let (mut le, mut ri) = (self.tin[u], self.tin[v]);
if le > ri {
std::mem::swap(&mut le, &mut ri);
}
self.p[self.rmq.query(le + 1..ri + 1).1].unwrap()
}
}
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
pub mod dijk;
pub mod dsu;
pub mod fenwick;
pub mod lca;
pub mod rmq;