pub struct TreeGraphScanner<U, T = ()>{
vsize: usize,
_marker: PhantomData<fn() -> (U, T)>,
}Fields§
§vsize: usize§_marker: PhantomData<fn() -> (U, T)>Implementations§
Source§impl<U, T> TreeGraphScanner<U, T>
impl<U, T> TreeGraphScanner<U, T>
Sourcepub fn new(vsize: usize) -> Self
pub fn new(vsize: usize) -> Self
Examples found in repository?
More examples
crates/library_checker/src/tree/jump_on_tree.rs (line 7)
5pub fn jump_on_tree(reader: impl Read, writer: impl Write) {
6 prepare_io!(reader, writer);
7 sc!(n, q, (g, _): @TreeGraphScanner::<usize>::new(n));
8 let hld = g.hld(0);
9 for _ in 0..q {
10 sc!(s, t, i);
11 pp!(hld.jump(s, t, i).unwrap_or(!0) as isize);
12 }
13}
14
15#[verify::library_checker("jump_on_tree")]
16pub fn jump_on_tree_level_ancestor(reader: impl Read, writer: impl Write) {
17 prepare_io!(reader, writer);
18 sc!(n, q, (g, _): @TreeGraphScanner::<usize>::new(n));
19 let la = g.level_ancestor(0);
20 let lca = g.lca(0);
21 for _ in 0..q {
22 sc!(s, t, i);
23 let l = lca.lca(s, t);
24 let dl = la.depth(l);
25 let ds = la.depth(s) - dl;
26 let dt = la.depth(t) - dl;
27 let ans = if i <= ds {
28 la.la(s, i)
29 } else if i <= ds + dt {
30 la.la(t, ds + dt - i)
31 } else {
32 None
33 };
34 pp!(ans.unwrap_or(!0) as isize);
35 }
36}
37
38#[verify::library_checker("jump_on_tree")]
39pub fn jump_on_tree_level_ancestor_batch(reader: impl Read, writer: impl Write) {
40 prepare_io!(reader, writer);
41 sc!(n, q, (g, _): @TreeGraphScanner::<usize>::new(n), queries: [(usize, usize, usize); iter q]);
42 let lca = g.lca(0);
43 let results = g.level_ancestor_batch(
44 0,
45 queries.map(|(s, t, i)| {
46 let l = lca.lca(s, t);
47 let dl = lca.depth(l);
48 let ds = lca.depth(s) - dl;
49 let dt = lca.depth(t) - dl;
50 if i <= ds {
51 (s, i)
52 } else if i <= ds + dt {
53 (t, ds + dt - i)
54 } else {
55 (0, n)
56 }
57 }),
58 );
59 pp!(@lf @it results.iter().map(|&v| v.unwrap_or(!0) as isize));
60}crates/aizu_online_judge/src/grl/grl_5_a.rs (line 7)
5pub fn grl_5_a(reader: impl Read, writer: impl Write) {
6 prepare_io!(reader, writer);
7 sc!(n, (graph, w): @TreeGraphScanner::<usize, u64>::new(n));
8 let d = graph.weighted_tree_depth::<AdditiveOperation<_>, _>(0, |eid| w[eid]);
9 let r = (0..n).max_by_key(|&u| d[u]).unwrap();
10 let ans = graph
11 .weighted_tree_depth::<AdditiveOperation<_>, _>(r, |eid| w[eid])
12 .into_iter()
13 .max()
14 .unwrap();
15 pp!(ans);
16}crates/library_checker/src/tree/vertex_set_path_composite.rs (line 16)
14pub fn vertex_set_path_composite(reader: impl Read, writer: impl Write) {
15 prepare_io!(reader, writer);
16 sc!(n, q, ab: [(M, M); n], (graph, _): @TreeGraphScanner::<usize, ()>::new(n));
17 let hld = graph.hld(0);
18 let mut fold = hld.build_fold::<LinearOperation<_>>(&ab);
19 for _ in 0..q {
20 sc!(query: Query);
21 match query {
22 Query::Set { p, cd } => {
23 fold.set(p, cd);
24 }
25 Query::Apply { u, v, x } => {
26 let (a, b) = fold.fold_vertices(u, v);
27 pp!(a * x + b);
28 }
29 }
30 }
31}crates/library_checker/src/tree/point_set_tree_path_composite_sum_fixed_root.rs (line 108)
103pub fn point_set_tree_path_composite_sum_fixed_root(reader: impl Read, writer: impl Write) {
104 prepare_io!(reader, writer);
105 sc!(n,
106 q,
107 value: [M; n],
108 (graph, edges): @TreeGraphScanner::<usize, (M, M)>::new(n));
109
110 let top_tree = graph.static_top_tree(0);
111 let mut dp = top_tree.dp::<Dp>(value, edges);
112
113 for _ in 0..q {
114 sc!(query: Query);
115 match query {
116 Query::SetVertex { v, x } => {
117 dp.set_vertex(v, x);
118 pp!(dp.fold_all().sum);
119 }
120 Query::SetEdge { e, a, b } => {
121 dp.set_edge(e, (a, b));
122 pp!(dp.fold_all().sum);
123 }
124 }
125 }
126}Additional examples can be found in:
Trait Implementations§
Source§impl<U, T> MarkedScan for TreeGraphScanner<U, T>
impl<U, T> MarkedScan for TreeGraphScanner<U, T>
type Output = (SparseGraph<UndirectedEdge>, Vec<<T as Scan>::Output>)
fn mscan<I: ScanSource>(self, iter: &mut I) -> Option<Self::Output>
Auto Trait Implementations§
impl<U, T> Freeze for TreeGraphScanner<U, T>
impl<U, T> RefUnwindSafe for TreeGraphScanner<U, T>
impl<U, T> Send for TreeGraphScanner<U, T>
impl<U, T> Sync for TreeGraphScanner<U, T>
impl<U, T> Unpin for TreeGraphScanner<U, T>
impl<U, T> UnsafeUnpin for TreeGraphScanner<U, T>
impl<U, T> UnwindSafe for TreeGraphScanner<U, T>
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