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>
impl<P, D, H, PE, EC, X, B, E> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, E>
pub fn with_parent( self, ) -> XorLinkedRootedTreeBuilder<RecordParent, D, H, PE, EC, X, B, E>
Sourcepub fn with_dfs_preorder(
self,
) -> XorLinkedRootedTreeBuilder<P, RecordDfsPreorder, H, PE, EC, X, RecordXorBottomUpOrder, E>
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}pub fn with_depth( self, ) -> XorLinkedRootedTreeBuilder<P, D, RecordDepth, PE, EC, X, RecordXorBottomUpOrder, E>
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>
impl<P, D, H, X, B> XorLinkedRootedTreeBuilder<P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>
Sourcepub fn with_eindexed(
self,
) -> XorLinkedRootedTreeBuilder<P, D, H, NoParentEdge, NoEdgeChild, X, B, EIndexed>
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>
impl<P, D, H, PE, EC, X, B> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, EIndexed>
pub fn with_parent_edge( self, ) -> XorLinkedRootedTreeBuilder<P, D, H, RecordParentEdge, EC, X, B, EIndexed>
pub fn with_edge_child( self, ) -> XorLinkedRootedTreeBuilder<P, D, H, PE, RecordEdgeChild, X, B, EIndexed>
Source§impl<P, D, H, X, B> XorLinkedRootedTreeBuilder<P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
impl<P, D, H, X, B> XorLinkedRootedTreeBuilder<P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
Sourcepub fn build_from_ordered_parents(
self,
parents: impl IntoIterator<Item = usize>,
) -> XorLinkedRootedTree<P, D, H, NoParentEdge, NoEdgeChild, X>
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}pub fn build<I>( self, root: usize, edges: I, ) -> XorLinkedRootedTree<P, D, H, NoParentEdge, NoEdgeChild, X>
Source§impl<P, D, H, PE, EC, X, B> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, EIndexed>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
impl<P, D, H, PE, EC, X, B> XorLinkedRootedTreeBuilder<P, D, H, PE, EC, X, B, EIndexed>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
pub fn build<I>( self, root: usize, edges: I, ) -> XorLinkedRootedTree<P, D, H, PE, EC, X>
Source§impl XorLinkedRootedTreeBuilder<NoParent, NoDfsPreorder, NoDepth, NoParentEdge, NoEdgeChild, NoXorBottomUpOrder, NoXorBottomUpOrder, EIndexed>
impl XorLinkedRootedTreeBuilder<NoParent, NoDfsPreorder, NoDepth, NoParentEdge, NoEdgeChild, NoXorBottomUpOrder, NoXorBottomUpOrder, EIndexed>
Sourcepub fn run<I, F>(self, root: usize, edges: I, f: F)
pub fn run<I, F>(self, root: usize, edges: I, f: F)
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> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more