pub struct XorLinkedRootedTreeScanner<U, T = (), P = NoParent, D = NoDfsPreorder, H = NoDepth, PE = NoParentEdge, EC = NoEdgeChild, X = NoXorBottomUpOrder, B = NoXorBottomUpOrder, E = NoEIndexed>{
n: usize,
root: usize,
_marker: PhantomData<fn() -> ((U, T), (P, D, H), (PE, EC), (X, B, E))>,
}Fields§
§n: usize§root: usize§_marker: PhantomData<fn() -> ((U, T), (P, D, H), (PE, EC), (X, B, E))>Implementations§
Source§impl<U, T> XorLinkedRootedTreeScanner<U, T>
impl<U, T> XorLinkedRootedTreeScanner<U, T>
Sourcepub fn new(n: usize, root: usize) -> Self
pub fn new(n: usize, root: usize) -> Self
Examples found in repository?
crates/library_checker/src/tree/vertex_add_path_sum.rs (line 19)
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<U, T, P, D, H, PE, EC, X, B, E> XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
impl<U, T, P, D, H, PE, EC, X, B, E> XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
Sourcepub fn with_parent(
self,
) -> XorLinkedRootedTreeScanner<U, T, RecordParent, D, H, PE, EC, X, B, E>
pub fn with_parent( self, ) -> XorLinkedRootedTreeScanner<U, T, RecordParent, D, H, PE, EC, X, B, E>
Examples found in repository?
crates/library_checker/src/tree/vertex_add_path_sum.rs (line 20)
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 with_dfs_preorder(
self,
) -> XorLinkedRootedTreeScanner<U, T, P, RecordDfsPreorder, H, PE, EC, X, RecordXorBottomUpOrder, E>
pub fn with_dfs_preorder( self, ) -> XorLinkedRootedTreeScanner<U, T, P, RecordDfsPreorder, H, PE, EC, X, RecordXorBottomUpOrder, E>
Examples found in repository?
crates/library_checker/src/tree/vertex_add_path_sum.rs (line 20)
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 with_depth( self, ) -> XorLinkedRootedTreeScanner<U, T, P, D, RecordDepth, PE, EC, X, RecordXorBottomUpOrder, E>
pub fn with_xor_bottom_up_order( self, ) -> XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, RecordXorBottomUpOrder, RecordXorBottomUpOrder, E>
Source§impl<U, T, P, D, H, X, B> XorLinkedRootedTreeScanner<U, T, P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>
impl<U, T, P, D, H, X, B> XorLinkedRootedTreeScanner<U, T, P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>
pub fn with_eindexed( self, ) -> XorLinkedRootedTreeScanner<U, T, P, D, H, NoParentEdge, NoEdgeChild, X, B, EIndexed>
Source§impl<U, T, P, D, H, PE, EC, X, B> XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, EIndexed>
impl<U, T, P, D, H, PE, EC, X, B> XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, EIndexed>
pub fn with_parent_edge( self, ) -> XorLinkedRootedTreeScanner<U, T, P, D, H, RecordParentEdge, EC, X, B, EIndexed>
pub fn with_edge_child( self, ) -> XorLinkedRootedTreeScanner<U, T, P, D, H, PE, RecordEdgeChild, X, B, EIndexed>
Trait Implementations§
Source§impl<U, T, P, D, H, X, B> MarkedScan for XorLinkedRootedTreeScanner<U, T, P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>where
U: Scan<Output = usize>,
T: Scan,
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
impl<U, T, P, D, H, X, B> MarkedScan for XorLinkedRootedTreeScanner<U, T, P, D, H, NoParentEdge, NoEdgeChild, X, B, NoEIndexed>where
U: Scan<Output = usize>,
T: Scan,
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
type Output = (XorLinkedRootedTree<P, D, H, NoParentEdge, NoEdgeChild, X>, Vec<<T as Scan>::Output>)
fn mscan<I: ScanSource>(self, iter: &mut I) -> Option<Self::Output>
Source§impl<U, T, P, D, H, PE, EC, X, B> MarkedScan for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, EIndexed>where
U: Scan<Output = usize>,
T: Scan,
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
impl<U, T, P, D, H, PE, EC, X, B> MarkedScan for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, EIndexed>where
U: Scan<Output = usize>,
T: Scan,
P: ParentComponent,
D: DfsPreorderComponent,
H: DepthComponent,
PE: ParentEdgeComponent,
EC: EdgeChildComponent,
X: BuildXorBottomUpOrder<B>,
B: XorBottomUpOrderBuffer,
Auto Trait Implementations§
impl<U, T, P, D, H, PE, EC, X, B, E> Freeze for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
impl<U, T, P, D, H, PE, EC, X, B, E> RefUnwindSafe for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
impl<U, T, P, D, H, PE, EC, X, B, E> Send for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
impl<U, T, P, D, H, PE, EC, X, B, E> Sync for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
impl<U, T, P, D, H, PE, EC, X, B, E> Unpin for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
impl<U, T, P, D, H, PE, EC, X, B, E> UnsafeUnpin for XorLinkedRootedTreeScanner<U, T, P, D, H, PE, EC, X, B, E>
impl<U, T, P, D, H, PE, EC, X, B, E> UnwindSafe for XorLinkedRootedTreeScanner<U, T, 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