pub struct XorLinkedRootedTree<P = NoParent, D = NoDfsPreorder, H = NoDepth, PE = NoParentEdge, EC = NoEdgeChild, X = NoXorBottomUpOrder>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
X: XorBottomUpOrderComponent,{
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
impl XorLinkedRootedTree
Sourcepub fn builder(n: usize) -> XorLinkedRootedTreeBuilder
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
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>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
impl<P, D, H, PE, EC, O> XorLinkedRootedTree<P, D, H, PE, EC, O>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
pub fn vertices_size(&self) -> usize
pub fn edges_size(&self) -> usize
pub fn root(&self) -> usize
Source§impl<D, H, PE, EC, O> XorLinkedRootedTree<RecordParent, D, H, PE, EC, O>where
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
impl<D, H, PE, EC, O> XorLinkedRootedTree<RecordParent, D, H, PE, EC, O>where
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
pub fn parent(&self, v: usize) -> usize
Sourcepub fn parents(&self) -> &[usize]
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>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
impl<P, D, H, PE, EC> XorLinkedRootedTree<P, D, H, PE, EC, RecordXorBottomUpOrder>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
Sourcepub fn xor_bottom_up_order(&self) -> &[usize]
pub fn xor_bottom_up_order(&self) -> &[usize]
Returns the bottom-up XOR order, excluding the root.
Sourcepub fn xor_top_down_order(
&self,
) -> impl DoubleEndedIterator<Item = usize> + ExactSizeIterator + '_
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>where
P: ParentComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
impl<P, H, PE, EC, O> XorLinkedRootedTree<P, RecordDfsPreorder, H, PE, EC, O>where
P: ParentComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
Sourcepub fn dfs_order(&self) -> &[usize]
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
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}Sourcepub fn dfs_index(&self, v: usize) -> usize
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
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}pub fn subtree_size(&self, v: usize) -> usize
Sourcepub fn subtree_range(&self, v: usize) -> Range<usize> ⓘ
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
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}pub fn children(&self, v: usize) -> Children<'_> ⓘ
Source§impl<P, D, PE, EC, O> XorLinkedRootedTree<P, D, RecordDepth, PE, EC, O>where
P: ParentComponent,
D: DfsPreorderComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
impl<P, D, PE, EC, O> XorLinkedRootedTree<P, D, RecordDepth, PE, EC, O>where
P: ParentComponent,
D: DfsPreorderComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
Source§impl<P, D, H, EC, O> XorLinkedRootedTree<P, D, H, RecordParentEdge, EC, O>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
impl<P, D, H, EC, O> XorLinkedRootedTree<P, D, H, RecordParentEdge, EC, O>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
EC: EdgeChildComponent,
O: XorBottomUpOrderComponent,
pub fn parent_edge(&self, v: usize) -> usize
pub fn parent_edges(&self) -> &[usize]
Source§impl<P, D, H, PE, O> XorLinkedRootedTree<P, D, H, PE, RecordEdgeChild, O>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
O: XorBottomUpOrderComponent,
impl<P, D, H, PE, O> XorLinkedRootedTree<P, D, H, PE, RecordEdgeChild, O>where
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
O: XorBottomUpOrderComponent,
pub fn edge_child(&self, eid: usize) -> usize
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>where
<P as ParentComponent>::Data: Freeze,
<D as DfsPreorderComponent>::Data: Freeze,
<H as DepthComponent>::Data: Freeze,
<PE as ParentEdgeComponent>::Data: Freeze,
<EC as EdgeChildComponent>::Data: Freeze,
<X as XorBottomUpOrderComponent>::Data: Freeze,
PhantomData<fn() -> (P, D, H, PE, EC, X)>: Freeze,
impl<P, D, H, PE, EC, X> RefUnwindSafe for XorLinkedRootedTree<P, D, H, PE, EC, X>where
<P as ParentComponent>::Data: RefUnwindSafe,
<D as DfsPreorderComponent>::Data: RefUnwindSafe,
<H as DepthComponent>::Data: RefUnwindSafe,
<PE as ParentEdgeComponent>::Data: RefUnwindSafe,
<EC as EdgeChildComponent>::Data: RefUnwindSafe,
<X as XorBottomUpOrderComponent>::Data: RefUnwindSafe,
PhantomData<fn() -> (P, D, H, PE, EC, X)>: RefUnwindSafe,
impl<P, D, H, PE, EC, X> Send for XorLinkedRootedTree<P, D, H, PE, EC, X>where
<P as ParentComponent>::Data: Send,
<D as DfsPreorderComponent>::Data: Send,
<H as DepthComponent>::Data: Send,
<PE as ParentEdgeComponent>::Data: Send,
<EC as EdgeChildComponent>::Data: Send,
<X as XorBottomUpOrderComponent>::Data: Send,
PhantomData<fn() -> (P, D, H, PE, EC, X)>: Send,
impl<P, D, H, PE, EC, X> Sync for XorLinkedRootedTree<P, D, H, PE, EC, X>where
<P as ParentComponent>::Data: Sync,
<D as DfsPreorderComponent>::Data: Sync,
<H as DepthComponent>::Data: Sync,
<PE as ParentEdgeComponent>::Data: Sync,
<EC as EdgeChildComponent>::Data: Sync,
<X as XorBottomUpOrderComponent>::Data: Sync,
PhantomData<fn() -> (P, D, H, PE, EC, X)>: Sync,
impl<P, D, H, PE, EC, X> Unpin for XorLinkedRootedTree<P, D, H, PE, EC, X>where
<P as ParentComponent>::Data: Unpin,
<D as DfsPreorderComponent>::Data: Unpin,
<H as DepthComponent>::Data: Unpin,
<PE as ParentEdgeComponent>::Data: Unpin,
<EC as EdgeChildComponent>::Data: Unpin,
<X as XorBottomUpOrderComponent>::Data: Unpin,
PhantomData<fn() -> (P, D, H, PE, EC, X)>: Unpin,
impl<P, D, H, PE, EC, X> UnsafeUnpin for XorLinkedRootedTree<P, D, H, PE, EC, X>where
<P as ParentComponent>::Data: UnsafeUnpin,
<D as DfsPreorderComponent>::Data: UnsafeUnpin,
<H as DepthComponent>::Data: UnsafeUnpin,
<PE as ParentEdgeComponent>::Data: UnsafeUnpin,
<EC as EdgeChildComponent>::Data: UnsafeUnpin,
<X as XorBottomUpOrderComponent>::Data: UnsafeUnpin,
PhantomData<fn() -> (P, D, H, PE, EC, X)>: UnsafeUnpin,
impl<P, D, H, PE, EC, X> UnwindSafe for XorLinkedRootedTree<P, D, H, PE, EC, X>where
<P as ParentComponent>::Data: UnwindSafe,
<D as DfsPreorderComponent>::Data: UnwindSafe,
<H as DepthComponent>::Data: UnwindSafe,
<PE as ParentEdgeComponent>::Data: UnwindSafe,
<EC as EdgeChildComponent>::Data: UnwindSafe,
<X as XorBottomUpOrderComponent>::Data: UnwindSafe,
PhantomData<fn() -> (P, D, H, PE, EC, X)>: UnwindSafe,
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