Skip to main content

EulerTour

Struct EulerTour 

Source
pub struct EulerTour<K>
where K: EulerTourKind,
{ pub root: usize, pub vidx: Vec<[usize; 2]>, pub eidx: Vec<[usize; 2]>, pub size: usize, _marker: PhantomData<fn() -> K>, }

Fields§

§root: usize§vidx: Vec<[usize; 2]>§eidx: Vec<[usize; 2]>§size: usize§_marker: PhantomData<fn() -> K>

Implementations§

Source§

impl EulerTour<First>

Source

pub fn get<T>(&self, u: usize, f: impl FnMut(usize) -> T) -> T

Source

pub fn update<T>(&self, u: usize, x: T, f: impl FnMut(usize, T))

Source

pub fn fold<T>(&self, u: usize, f: impl FnMut(Range<usize>) -> T) -> T

Source

pub fn range_update<T>(&self, u: usize, x: T, f: impl FnMut(Range<usize>, T))

Source§

impl EulerTour<FirstLast>

Source

pub fn get<T>(&self, u: usize, f: impl FnMut(usize) -> T) -> T

Source

pub fn update<T>(&self, u: usize, x: T, invx: T, f: impl FnMut(usize, T))

Examples found in repository?
crates/aizu_online_judge/src/grl/grl_5_d.rs (line 31)
15pub fn grl_5_d(reader: impl Read, writer: impl Write) {
16    prepare_io!(reader, writer);
17    sc!(n, c: [SizedCollect<usize>; iter n]);
18    let edges = c
19        .enumerate()
20        .flat_map(|(u, it)| it.into_iter().map(move |v| (u, v)))
21        .collect();
22    let graph = UndirectedSparseGraph::from_edges(n, edges);
23    let et = graph.path_euler_tour_builder(0).build();
24    let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::new(et.size);
25
26    sc!(q);
27    for _ in 0..q {
28        sc!(query: Query);
29        match query {
30            Query::Add { v, w } => {
31                et.update(v, w, -w, |k, x| bit.update(k, x));
32            }
33            Query::Get { u } => {
34                let ans = et.fold(u, |k| bit.accumulate(k));
35                pp!(ans);
36            }
37        }
38    }
39}
Source

pub fn fold<T>(&self, u: usize, f: impl FnMut(usize) -> T) -> T

Examples found in repository?
crates/aizu_online_judge/src/grl/grl_5_d.rs (line 34)
15pub fn grl_5_d(reader: impl Read, writer: impl Write) {
16    prepare_io!(reader, writer);
17    sc!(n, c: [SizedCollect<usize>; iter n]);
18    let edges = c
19        .enumerate()
20        .flat_map(|(u, it)| it.into_iter().map(move |v| (u, v)))
21        .collect();
22    let graph = UndirectedSparseGraph::from_edges(n, edges);
23    let et = graph.path_euler_tour_builder(0).build();
24    let mut bit = BinaryIndexedTree::<AdditiveOperation<_>>::new(et.size);
25
26    sc!(q);
27    for _ in 0..q {
28        sc!(query: Query);
29        match query {
30            Query::Add { v, w } => {
31                et.update(v, w, -w, |k, x| bit.update(k, x));
32            }
33            Query::Get { u } => {
34                let ans = et.fold(u, |k| bit.accumulate(k));
35                pp!(ans);
36            }
37        }
38    }
39}

Trait Implementations§

Source§

impl<K> Clone for EulerTour<K>
where K: EulerTourKind + Clone,

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl<K> Debug for EulerTour<K>
where K: EulerTourKind + Debug,

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<K> Freeze for EulerTour<K>
where PhantomData<fn() -> K>: Freeze,

§

impl<K> RefUnwindSafe for EulerTour<K>
where PhantomData<fn() -> K>: RefUnwindSafe,

§

impl<K> Send for EulerTour<K>
where PhantomData<fn() -> K>: Send,

§

impl<K> Sync for EulerTour<K>
where PhantomData<fn() -> K>: Sync,

§

impl<K> Unpin for EulerTour<K>
where PhantomData<fn() -> K>: Unpin,

§

impl<K> UnsafeUnpin for EulerTour<K>
where PhantomData<fn() -> K>: UnsafeUnpin,

§

impl<K> UnwindSafe for EulerTour<K>
where PhantomData<fn() -> K>: UnwindSafe,

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. 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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
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.