pub struct RangeSumRangeChminChmaxAdd<T> {
min: T,
max: T,
min2: T,
max2: T,
pub sum: T,
size: T,
n_min: T,
n_max: T,
}Fields§
§min: T§max: T§min2: T§max2: T§sum: T§size: T§n_min: T§n_max: TImplementations§
Source§impl<T> RangeSumRangeChminChmaxAdd<T>
impl<T> RangeSumRangeChminChmaxAdd<T>
Sourcepub fn single(key: T, size: T) -> Self
pub fn single(key: T, size: T) -> Self
Examples found in repository?
crates/competitive/src/algebra/lazy_map.rs (line 550)
549 fn single_agg(&key: &Self::Key) -> Self::Agg {
550 Self::single(key, T::one())
551 }
552 fn act_agg(x: &Self::Agg, a: &Self::Act) -> Option<Self::Agg> {
553 Some(if Self::is_act_unit(a) {
554 x.clone()
555 } else if x.size.is_zero() {
556 Self::unit()
557 } else if x.min == x.max || a.lb == a.ub || a.lb >= x.max || a.ub <= x.min {
558 Self::single(x.min.max(a.lb).min(a.ub) + a.bias, x.size)
559 } else if x.min2 == x.max {
560 let mut x = x.clone();
561 let min = x.min.max(a.lb) + a.bias;
562 let max = x.max.min(a.ub) + a.bias;
563 x.min = min;
564 x.max2 = min;
565 x.max = max;
566 x.min2 = max;
567 x.sum = min * x.n_min + max * x.n_max;
568 x
569 } else if a.lb < x.min2 && x.max2 < a.ub {
570 let mut x = x.clone();
571 let min = x.min.max(a.lb);
572 let max = x.max.min(a.ub);
573 x.sum = x.sum + (min - x.min) * x.n_min + (max - x.max) * x.n_max + a.bias * x.size;
574 x.min = min + a.bias;
575 x.max = max + a.bias;
576 x.min2 = x.min2 + a.bias;
577 x.max2 = x.max2 + a.bias;
578 x
579 } else {
580 return None;
581 })
582 }Trait Implementations§
impl<T> Associative for RangeSumRangeChminChmaxAdd<T>
Source§impl<T: Clone> Clone for RangeSumRangeChminChmaxAdd<T>
impl<T: Clone> Clone for RangeSumRangeChminChmaxAdd<T>
Source§impl<T: Debug> Debug for RangeSumRangeChminChmaxAdd<T>
impl<T: Debug> Debug for RangeSumRangeChminChmaxAdd<T>
impl<T: Eq> Eq for RangeSumRangeChminChmaxAdd<T>
Source§impl<T> LazyMapMonoid for RangeSumRangeChminChmaxAdd<T>
impl<T> LazyMapMonoid for RangeSumRangeChminChmaxAdd<T>
type Key = T
type Agg = RangeSumRangeChminChmaxAdd<T>
type Act = RangeChminChmaxAdd<T>
type AggMonoid = RangeSumRangeChminChmaxAdd<T>
type ActMonoid = RangeChminChmaxAdd<T>
type KeyAct = RangeChminChmaxAdd<T>
fn single_agg(key: &Self::Key) -> Self::Agg
fn act_agg(x: &Self::Agg, a: &Self::Act) -> Option<Self::Agg>
fn toggle(_x: &mut Self::Agg)
fn is_act_unit(act: &Self::Act) -> bool
fn act_key(x: &Self::Key, a: &Self::Act) -> Self::Key
fn agg_unit() -> Self::Agg
fn act_unit() -> Self::Act
fn agg_operate(x: &Self::Agg, y: &Self::Agg) -> Self::Agg
fn act_operate(x: &Self::Act, y: &Self::Act) -> Self::Act
fn agg_operate_assign(x: &mut Self::Agg, y: &Self::Agg)
fn act_operate_assign(x: &mut Self::Act, y: &Self::Act)
Source§impl<T> Magma for RangeSumRangeChminChmaxAdd<T>
impl<T> Magma for RangeSumRangeChminChmaxAdd<T>
Source§impl<T: PartialEq> PartialEq for RangeSumRangeChminChmaxAdd<T>
impl<T: PartialEq> PartialEq for RangeSumRangeChminChmaxAdd<T>
impl<T: PartialEq> StructuralPartialEq for RangeSumRangeChminChmaxAdd<T>
Source§impl<T> Unital for RangeSumRangeChminChmaxAdd<T>
impl<T> Unital for RangeSumRangeChminChmaxAdd<T>
Auto Trait Implementations§
impl<T> Freeze for RangeSumRangeChminChmaxAdd<T>where
T: Freeze,
impl<T> RefUnwindSafe for RangeSumRangeChminChmaxAdd<T>where
T: RefUnwindSafe,
impl<T> Send for RangeSumRangeChminChmaxAdd<T>where
T: Send,
impl<T> Sync for RangeSumRangeChminChmaxAdd<T>where
T: Sync,
impl<T> Unpin for RangeSumRangeChminChmaxAdd<T>where
T: Unpin,
impl<T> UnsafeUnpin for RangeSumRangeChminChmaxAdd<T>where
T: UnsafeUnpin,
impl<T> UnwindSafe for RangeSumRangeChminChmaxAdd<T>where
T: 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