Skip to main content

XorLinkedRootedTree

Struct XorLinkedRootedTree 

Source
pub struct XorLinkedRootedTree<P = NoParent, D = NoDfsPreorder, H = NoDepth, PE = NoParentEdge, EC = NoEdgeChild, X = NoXorBottomUpOrder>{
    n: usize,
    root: usize,
    parent: P::Data,
    dfs: D::Data,
    depth: H::Data,
    parent_edge: PE::Data,
    edge_child: EC::Data,
    xor_order: X::Data,
    _marker: PhantomData<fn() -> (P, D, H, PE, EC, X)>,
}

Fields§

§n: usize§root: usize§parent: P::Data§dfs: D::Data§depth: H::Data§parent_edge: PE::Data§edge_child: EC::Data§xor_order: X::Data§_marker: PhantomData<fn() -> (P, D, H, PE, EC, X)>

Implementations§

Source§

impl XorLinkedRootedTree

Source

pub fn builder(n: usize) -> XorLinkedRootedTreeBuilder

Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 20)
17pub fn vertex_add_subtree_sum(reader: impl Read, writer: impl Write) {
18    prepare_io!(reader, writer);
19    sc!(n, q, a: [u64; n], p: [usize; iter n - 1]);
20    let tree = XorLinkedRootedTree::builder(n)
21        .with_dfs_preorder()
22        .build_from_ordered_parents(p);
23    let b: Vec<_> = tree.dfs_order().iter().map(|&v| a[v]).collect();
24    let mut seg = DaryPrefixSumTreeU64::from_slice(&b);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Add { u, x } => seg.update(tree.dfs_index(u), x),
29            Query::Sum { u } => {
30                let range = tree.subtree_range(u);
31                pp!(seg.fold(range.start, range.end));
32            }
33        }
34    }
35}
More examples
Hide additional examples
crates/library_checker/src/tree/tree_diameter.rs (line 11)
5pub fn tree_diameter(reader: impl Read, writer: impl Write) {
6    prepare_io!(reader, writer);
7    sc!(n, edges: [(u32, u32, u64); n - 1]);
8    let mut parent = vec![n as u32; n];
9    let mut farthest: Vec<_> = (0..n).map(|u| (0, u)).collect();
10    let (mut diameter, mut left, mut right, mut center) = (0, 0, 0, 0);
11    XorLinkedRootedTree::builder(n).with_eindexed().run(
12        0,
13        edges.iter().map(|&(u, v, _)| (u as usize, v as usize)),
14        |u, p, e| {
15            parent[u] = p as u32;
16            let distance = farthest[u].0 + edges[e].2;
17            if diameter < distance + farthest[p].0 {
18                diameter = distance + farthest[p].0;
19                left = farthest[u].1;
20                right = farthest[p].1;
21                center = p;
22            }
23            if farthest[p].0 < distance {
24                farthest[p] = (distance, farthest[u].1);
25            }
26        },
27    );
28    let mut path = Vec::new();
29    while left != center {
30        path.push(left);
31        left = parent[left] as usize;
32    }
33    path.push(center);
34    let middle = path.len();
35    while right != center {
36        path.push(right);
37        right = parent[right] as usize;
38    }
39    path[middle..].reverse();
40    pp!(diameter, path.len(); @it path);
41}
Source§

impl<P, D, H, PE, EC, O> XorLinkedRootedTree<P, D, H, PE, EC, O>

Source

pub fn vertices_size(&self) -> usize

Source

pub fn edges_size(&self) -> usize

Source

pub fn root(&self) -> usize

Source§

impl<D, H, PE, EC, O> XorLinkedRootedTree<RecordParent, D, H, PE, EC, O>

Source

pub fn parent(&self, v: usize) -> usize

Source

pub fn parents(&self) -> &[usize]

Examples found in repository?
crates/library_checker/src/tree/vertex_add_path_sum.rs (line 21)
16pub fn vertex_add_path_sum(reader: impl Read, writer: impl Write) {
17    prepare_io!(reader, writer);
18    sc!(n, q, mut a: [i64; n],
19        (tree, _): @XorLinkedRootedTreeScanner::<usize, ()>::new(n, 0)
20            .with_parent().with_dfs_preorder());
21    let lca = LowestCommonAncestor::from_dfs_preorder(tree.parents(), tree.dfs_order());
22    let mut values = vec![0; n + 1];
23    for (u, &x) in a.iter().enumerate() {
24        let range = tree.subtree_range(u);
25        values[range.start] += x;
26        values[range.end] -= x;
27    }
28    let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::from_slice(&values);
29    for _ in 0..q {
30        sc!(query: Query);
31        match query {
32            Query::Add { p, x } => {
33                a[p] += x;
34                let range = tree.subtree_range(p);
35                bit.update(range.start, x);
36                bit.update(range.end, -x);
37            }
38            Query::Sum { u, v } => {
39                let p = lca.lca(u, v);
40                pp!(
41                    a[p] + bit.accumulate(tree.dfs_index(u)) + bit.accumulate(tree.dfs_index(v))
42                        - 2 * bit.accumulate(tree.dfs_index(p))
43                );
44            }
45        }
46    }
47}
Source§

impl<P, D, H, PE, EC> XorLinkedRootedTree<P, D, H, PE, EC, RecordXorBottomUpOrder>

Source

pub fn xor_bottom_up_order(&self) -> &[usize]

Returns the bottom-up XOR order, excluding the root.

Source

pub fn xor_top_down_order( &self, ) -> impl DoubleEndedIterator<Item = usize> + ExactSizeIterator + '_

Returns the top-down XOR order, excluding the root.

Source§

impl<P, H, PE, EC, O> XorLinkedRootedTree<P, RecordDfsPreorder, H, PE, EC, O>

Source

pub fn dfs_order(&self) -> &[usize]

Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 23)
17pub fn vertex_add_subtree_sum(reader: impl Read, writer: impl Write) {
18    prepare_io!(reader, writer);
19    sc!(n, q, a: [u64; n], p: [usize; iter n - 1]);
20    let tree = XorLinkedRootedTree::builder(n)
21        .with_dfs_preorder()
22        .build_from_ordered_parents(p);
23    let b: Vec<_> = tree.dfs_order().iter().map(|&v| a[v]).collect();
24    let mut seg = DaryPrefixSumTreeU64::from_slice(&b);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Add { u, x } => seg.update(tree.dfs_index(u), x),
29            Query::Sum { u } => {
30                let range = tree.subtree_range(u);
31                pp!(seg.fold(range.start, range.end));
32            }
33        }
34    }
35}
More examples
Hide additional examples
crates/library_checker/src/tree/vertex_add_path_sum.rs (line 21)
16pub fn vertex_add_path_sum(reader: impl Read, writer: impl Write) {
17    prepare_io!(reader, writer);
18    sc!(n, q, mut a: [i64; n],
19        (tree, _): @XorLinkedRootedTreeScanner::<usize, ()>::new(n, 0)
20            .with_parent().with_dfs_preorder());
21    let lca = LowestCommonAncestor::from_dfs_preorder(tree.parents(), tree.dfs_order());
22    let mut values = vec![0; n + 1];
23    for (u, &x) in a.iter().enumerate() {
24        let range = tree.subtree_range(u);
25        values[range.start] += x;
26        values[range.end] -= x;
27    }
28    let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::from_slice(&values);
29    for _ in 0..q {
30        sc!(query: Query);
31        match query {
32            Query::Add { p, x } => {
33                a[p] += x;
34                let range = tree.subtree_range(p);
35                bit.update(range.start, x);
36                bit.update(range.end, -x);
37            }
38            Query::Sum { u, v } => {
39                let p = lca.lca(u, v);
40                pp!(
41                    a[p] + bit.accumulate(tree.dfs_index(u)) + bit.accumulate(tree.dfs_index(v))
42                        - 2 * bit.accumulate(tree.dfs_index(p))
43                );
44            }
45        }
46    }
47}
Source

pub fn dfs_index(&self, v: usize) -> usize

Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 28)
17pub fn vertex_add_subtree_sum(reader: impl Read, writer: impl Write) {
18    prepare_io!(reader, writer);
19    sc!(n, q, a: [u64; n], p: [usize; iter n - 1]);
20    let tree = XorLinkedRootedTree::builder(n)
21        .with_dfs_preorder()
22        .build_from_ordered_parents(p);
23    let b: Vec<_> = tree.dfs_order().iter().map(|&v| a[v]).collect();
24    let mut seg = DaryPrefixSumTreeU64::from_slice(&b);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Add { u, x } => seg.update(tree.dfs_index(u), x),
29            Query::Sum { u } => {
30                let range = tree.subtree_range(u);
31                pp!(seg.fold(range.start, range.end));
32            }
33        }
34    }
35}
More examples
Hide additional examples
crates/library_checker/src/tree/vertex_add_path_sum.rs (line 41)
16pub fn vertex_add_path_sum(reader: impl Read, writer: impl Write) {
17    prepare_io!(reader, writer);
18    sc!(n, q, mut a: [i64; n],
19        (tree, _): @XorLinkedRootedTreeScanner::<usize, ()>::new(n, 0)
20            .with_parent().with_dfs_preorder());
21    let lca = LowestCommonAncestor::from_dfs_preorder(tree.parents(), tree.dfs_order());
22    let mut values = vec![0; n + 1];
23    for (u, &x) in a.iter().enumerate() {
24        let range = tree.subtree_range(u);
25        values[range.start] += x;
26        values[range.end] -= x;
27    }
28    let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::from_slice(&values);
29    for _ in 0..q {
30        sc!(query: Query);
31        match query {
32            Query::Add { p, x } => {
33                a[p] += x;
34                let range = tree.subtree_range(p);
35                bit.update(range.start, x);
36                bit.update(range.end, -x);
37            }
38            Query::Sum { u, v } => {
39                let p = lca.lca(u, v);
40                pp!(
41                    a[p] + bit.accumulate(tree.dfs_index(u)) + bit.accumulate(tree.dfs_index(v))
42                        - 2 * bit.accumulate(tree.dfs_index(p))
43                );
44            }
45        }
46    }
47}
Source

pub fn subtree_size(&self, v: usize) -> usize

Source

pub fn subtree_range(&self, v: usize) -> Range<usize> ⓘ

Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 30)
17pub fn vertex_add_subtree_sum(reader: impl Read, writer: impl Write) {
18    prepare_io!(reader, writer);
19    sc!(n, q, a: [u64; n], p: [usize; iter n - 1]);
20    let tree = XorLinkedRootedTree::builder(n)
21        .with_dfs_preorder()
22        .build_from_ordered_parents(p);
23    let b: Vec<_> = tree.dfs_order().iter().map(|&v| a[v]).collect();
24    let mut seg = DaryPrefixSumTreeU64::from_slice(&b);
25    for _ in 0..q {
26        sc!(query: Query);
27        match query {
28            Query::Add { u, x } => seg.update(tree.dfs_index(u), x),
29            Query::Sum { u } => {
30                let range = tree.subtree_range(u);
31                pp!(seg.fold(range.start, range.end));
32            }
33        }
34    }
35}
More examples
Hide additional examples
crates/library_checker/src/tree/vertex_add_path_sum.rs (line 24)
16pub fn vertex_add_path_sum(reader: impl Read, writer: impl Write) {
17    prepare_io!(reader, writer);
18    sc!(n, q, mut a: [i64; n],
19        (tree, _): @XorLinkedRootedTreeScanner::<usize, ()>::new(n, 0)
20            .with_parent().with_dfs_preorder());
21    let lca = LowestCommonAncestor::from_dfs_preorder(tree.parents(), tree.dfs_order());
22    let mut values = vec![0; n + 1];
23    for (u, &x) in a.iter().enumerate() {
24        let range = tree.subtree_range(u);
25        values[range.start] += x;
26        values[range.end] -= x;
27    }
28    let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::from_slice(&values);
29    for _ in 0..q {
30        sc!(query: Query);
31        match query {
32            Query::Add { p, x } => {
33                a[p] += x;
34                let range = tree.subtree_range(p);
35                bit.update(range.start, x);
36                bit.update(range.end, -x);
37            }
38            Query::Sum { u, v } => {
39                let p = lca.lca(u, v);
40                pp!(
41                    a[p] + bit.accumulate(tree.dfs_index(u)) + bit.accumulate(tree.dfs_index(v))
42                        - 2 * bit.accumulate(tree.dfs_index(p))
43                );
44            }
45        }
46    }
47}
Source

pub fn children(&self, v: usize) -> Children<'_> ⓘ

Source§

impl<P, D, PE, EC, O> XorLinkedRootedTree<P, D, RecordDepth, PE, EC, O>

Source

pub fn depth(&self, v: usize) -> usize

Source

pub fn depths(&self) -> &[usize]

Source§

impl<P, D, H, EC, O> XorLinkedRootedTree<P, D, H, RecordParentEdge, EC, O>

Source

pub fn parent_edge(&self, v: usize) -> usize

Source

pub fn parent_edges(&self) -> &[usize]

Source§

impl<P, D, H, PE, O> XorLinkedRootedTree<P, D, H, PE, RecordEdgeChild, O>

Source

pub fn edge_child(&self, eid: usize) -> usize

Source

pub fn edge_children(&self) -> &[usize]

Auto Trait Implementations§

§

impl<P, D, H, PE, EC, X> Freeze for XorLinkedRootedTree<P, D, H, PE, EC, X>

§

impl<P, D, H, PE, EC, X> RefUnwindSafe for XorLinkedRootedTree<P, D, H, PE, EC, X>

§

impl<P, D, H, PE, EC, X> Send for XorLinkedRootedTree<P, D, H, PE, EC, X>

§

impl<P, D, H, PE, EC, X> Sync for XorLinkedRootedTree<P, D, H, PE, EC, X>

§

impl<P, D, H, PE, EC, X> Unpin for XorLinkedRootedTree<P, D, H, PE, EC, X>

§

impl<P, D, H, PE, EC, X> UnsafeUnpin for XorLinkedRootedTree<P, D, H, PE, EC, X>

§

impl<P, D, H, PE, EC, X> UnwindSafe for XorLinkedRootedTree<P, D, H, PE, EC, X>

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> ToArrayVecScalar for T

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.