Skip to main content

TreeGraphScanner

Struct TreeGraphScanner 

Source
pub struct TreeGraphScanner<U, T = ()>
where U: Scan<Output = usize>, T: Scan,
{ vsize: usize, _marker: PhantomData<fn() -> (U, T)>, }

Fields§

§vsize: usize§_marker: PhantomData<fn() -> (U, T)>

Implementations§

Source§

impl<U, T> TreeGraphScanner<U, T>
where U: Scan<Output = usize>, T: Scan,

Source

pub fn new(vsize: usize) -> Self

Examples found in repository?
crates/library_checker/src/tree/frequency_table_of_tree_distance.rs (line 7)
5pub fn frequency_table_of_tree_distance(reader: impl Read, writer: impl Write) {
6    prepare_io!(reader, writer);
7    sc!(n, (g, _): @TreeGraphScanner::<usize>::new(n));
8    let freqs = g.distance_frequencies();
9    pp!(@it freqs[1..].iter().map(|&f| f / 2));
10}
More examples
Hide additional 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_b.rs (line 7)
5pub fn grl_5_b(reader: impl Read, writer: impl Write) {
6    prepare_io!(reader, writer);
7    sc!(n, (graph, w): @TreeGraphScanner::<usize, u64>::new(n));
8    let re = ReRooting::<MaxOperation<u64>, _>::new(&graph, |d, _vid, eid_opt| {
9        d + eid_opt.map_or(0, |eid| w[eid])
10    });
11    pp!(@lf @it re.dp);
12}
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}

Trait Implementations§

Source§

impl<U, T> MarkedScan for TreeGraphScanner<U, T>
where U: Scan<Output = usize>, T: Scan,

Auto Trait Implementations§

§

impl<U, T> Freeze for TreeGraphScanner<U, T>
where PhantomData<fn() -> (U, T)>: Freeze,

§

impl<U, T> RefUnwindSafe for TreeGraphScanner<U, T>

§

impl<U, T> Send for TreeGraphScanner<U, T>
where PhantomData<fn() -> (U, T)>: Send,

§

impl<U, T> Sync for TreeGraphScanner<U, T>
where PhantomData<fn() -> (U, T)>: Sync,

§

impl<U, T> Unpin for TreeGraphScanner<U, T>
where PhantomData<fn() -> (U, T)>: Unpin,

§

impl<U, T> UnsafeUnpin for TreeGraphScanner<U, T>

§

impl<U, T> UnwindSafe for TreeGraphScanner<U, T>

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.