Skip to main content

XorLinkedRootedTreeBuilder

Struct XorLinkedRootedTreeBuilder 

Source
pub struct XorLinkedRootedTreeBuilder<P = NoParent, D = NoDfsPreorder, H = NoDepth, PE = NoParentEdge, EC = NoEdgeChild, X = NoXorBottomUpOrder, B = NoXorBottomUpOrder, E = NoEIndexed> {
    n: usize,
    _marker: PhantomData<fn() -> ((P, D, H), (PE, EC), (X, B, E))>,
}

Fields§

§n: usize§_marker: PhantomData<fn() -> ((P, D, H), (PE, EC), (X, B, E))>

Implementations§

Source§

impl<P, D, H, PE, EC, X, B, E> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

Source

pub fn with_parent( self, ) -> XorLinkedRootedTreeBuilder<RecordParent, D, H, PE, EC, X, B, E>

Source

pub fn with_dfs_preorder( self, ) -> XorLinkedRootedTreeBuilder<P, RecordDfsPreorder, H, PE, EC, X, RecordXorBottomUpOrder, E>

Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 21)
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}
Source

pub fn with_depth( self, ) -> XorLinkedRootedTreeBuilder<P, D, RecordDepth, PE, EC, X, RecordXorBottomUpOrder, E>

Source

pub fn with_xor_bottom_up_order( self, ) -> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, RecordXorBottomUpOrder, RecordXorBottomUpOrder, E>

Source§

impl<P, D, H, X, B> XorLinkedRootedTreeBuilder<P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>

Source

pub fn with_eindexed( self, ) -> XorLinkedRootedTreeBuilder<P, D, H, NoParentEdge, NoEdgeChild, X, B, EIndexed>

Examples found in repository?
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, X, B> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, EIndexed>

Source§

impl<P, D, H, X, B> XorLinkedRootedTreeBuilder<P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>

Source

pub fn build_from_ordered_parents( self, parents: impl IntoIterator<Item = usize>, ) -> XorLinkedRootedTree<P, D, H, NoParentEdge, NoEdgeChild, X>

Builds a tree rooted at 0. The n - 1 parents are in vertex order, and the parent of vertex v must be less than v.

Examples found in repository?
crates/library_checker/src/tree/vertex_add_subtree_sum.rs (line 22)
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}
Source

pub fn build<I>( self, root: usize, edges: I, ) -> XorLinkedRootedTree<P, D, H, NoParentEdge, NoEdgeChild, X>
where I: IntoIterator<Item = (usize, usize)>,

Source§

impl<P, D, H, PE, EC, X, B> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, EIndexed>

Source

pub fn build<I>( self, root: usize, edges: I, ) -> XorLinkedRootedTree<P, D, H, PE, EC, X>
where I: IntoIterator<Item = (usize, usize)>,

Source§

impl XorLinkedRootedTreeBuilder

Source

pub fn run<I, F>(self, root: usize, edges: I, f: F)
where I: IntoIterator<Item = (usize, usize)>, F: FnMut(usize, usize),

Source§

impl XorLinkedRootedTreeBuilder<NoParent, NoDfsPreorder, NoDepth, NoParentEdge, NoEdgeChild, NoXorBottomUpOrder, NoXorBottomUpOrder, EIndexed>

Source

pub fn run<I, F>(self, root: usize, edges: I, f: F)
where I: IntoIterator<Item = (usize, usize)>, F: FnMut(usize, usize, usize),

Examples found in repository?
crates/library_checker/src/tree/tree_diameter.rs (lines 11-27)
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}

Auto Trait Implementations§

§

impl<P, D, H, PE, EC, X, B, E> Freeze for XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

§

impl<P, D, H, PE, EC, X, B, E> RefUnwindSafe for XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

§

impl<P, D, H, PE, EC, X, B, E> Send for XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

§

impl<P, D, H, PE, EC, X, B, E> Sync for XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

§

impl<P, D, H, PE, EC, X, B, E> Unpin for XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

§

impl<P, D, H, PE, EC, X, B, E> UnsafeUnpin for XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

§

impl<P, D, H, PE, EC, X, B, E> UnwindSafe for XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>

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.