Skip to main content

RangeFrequencyProcessor

Struct RangeFrequencyProcessor 

Source
struct RangeFrequencyProcessor {
    bit: BinaryIndexedTree<AdditiveOperation<i32>>,
    data: Vec<u64>,
}

Fields§

§bit: BinaryIndexedTree<AdditiveOperation<i32>>§data: Vec<u64>

Implementations§

Source§

impl RangeFrequencyProcessor

Source

fn new(size: usize) -> Self

Examples found in repository?
crates/competitive/src/data_structure/range_frequency.rs (line 178)
127    pub fn execute_with_callback(mut self, mut callback: impl FnMut(usize, usize)) {
128        for output_index in self.zero_queries {
129            callback(output_index as usize, 0);
130        }
131        if let Some(mut queries) = self.static_queries.take() {
132            let n = self.array.len();
133            if queries.is_empty() {
134                return;
135            }
136            let mut offsets = vec![0; n + 2];
137            for &(left, right, _, _) in &queries {
138                if left < right {
139                    offsets[left as usize + 1] += 1;
140                    offsets[right as usize + 1] += 1;
141                }
142            }
143            for i in 0..=n {
144                offsets[i + 1] += offsets[i];
145            }
146            let mut next = offsets.clone();
147            let mut events = vec![0u32; 2 * queries.len()];
148            for (i, &(left, right, _, output_index)) in queries.iter().enumerate() {
149                if left >= right {
150                    callback(output_index as usize, 0);
151                    continue;
152                }
153                for (side, position) in [left, right].into_iter().enumerate() {
154                    events[next[position as usize]] = (2 * i + side) as u32;
155                    next[position as usize] += 1;
156                }
157            }
158            let mut count = vec![0u32; self.values.len()];
159            for position in 0..=n {
160                for &endpoint in &events[offsets[position]..offsets[position + 1]] {
161                    let query = (endpoint >> 1) as usize;
162                    let frequency = count[queries[query].2 as usize];
163                    if endpoint & 1 == 0 {
164                        queries[query].0 = frequency;
165                    } else {
166                        callback(
167                            queries[query].3 as usize,
168                            (frequency - queries[query].0) as usize,
169                        );
170                    }
171                }
172                if position < n {
173                    count[self.array[position] as usize] += 1;
174                }
175            }
176            return;
177        }
178        let mut processor = RangeFrequencyProcessor::new(self.array.len());
179        for (index, value) in self.array.into_iter().enumerate() {
180            self.events.push((
181                value,
182                RangeFrequencyQuery::Remove {
183                    index: index as u32,
184                },
185            ));
186        }
187        let mut offsets = vec![0; self.queried.len() + 1];
188        for &(value, _) in &self.events {
189            offsets[value as usize + 1] += self.queried[value as usize] as usize;
190        }
191        for i in 0..self.queried.len() {
192            offsets[i + 1] += offsets[i];
193        }
194        let mut next = offsets.clone();
195        let mut events = vec![RangeFrequencyQuery::Add { index: 0 }; *offsets.last().unwrap()];
196        for (value, event) in self.events {
197            let value = value as usize;
198            if self.queried[value] != 0 {
199                events[next[value]] = event;
200                next[value] += 1;
201            }
202        }
203        for range in offsets.windows(2) {
204            for &query in &events[range[0]..range[1]] {
205                match query {
206                    RangeFrequencyQuery::Add { index } => {
207                        processor.add(index);
208                    }
209                    RangeFrequencyQuery::Remove { index } => {
210                        processor.remove(index);
211                    }
212                    RangeFrequencyQuery::Query {
213                        left,
214                        right,
215                        output_index,
216                    } => {
217                        callback(output_index as usize, processor.query(left, right));
218                    }
219                }
220            }
221        }
222    }
Source

fn add(&mut self, index: u32)

Examples found in repository?
crates/competitive/src/data_structure/range_frequency.rs (line 207)
127    pub fn execute_with_callback(mut self, mut callback: impl FnMut(usize, usize)) {
128        for output_index in self.zero_queries {
129            callback(output_index as usize, 0);
130        }
131        if let Some(mut queries) = self.static_queries.take() {
132            let n = self.array.len();
133            if queries.is_empty() {
134                return;
135            }
136            let mut offsets = vec![0; n + 2];
137            for &(left, right, _, _) in &queries {
138                if left < right {
139                    offsets[left as usize + 1] += 1;
140                    offsets[right as usize + 1] += 1;
141                }
142            }
143            for i in 0..=n {
144                offsets[i + 1] += offsets[i];
145            }
146            let mut next = offsets.clone();
147            let mut events = vec![0u32; 2 * queries.len()];
148            for (i, &(left, right, _, output_index)) in queries.iter().enumerate() {
149                if left >= right {
150                    callback(output_index as usize, 0);
151                    continue;
152                }
153                for (side, position) in [left, right].into_iter().enumerate() {
154                    events[next[position as usize]] = (2 * i + side) as u32;
155                    next[position as usize] += 1;
156                }
157            }
158            let mut count = vec![0u32; self.values.len()];
159            for position in 0..=n {
160                for &endpoint in &events[offsets[position]..offsets[position + 1]] {
161                    let query = (endpoint >> 1) as usize;
162                    let frequency = count[queries[query].2 as usize];
163                    if endpoint & 1 == 0 {
164                        queries[query].0 = frequency;
165                    } else {
166                        callback(
167                            queries[query].3 as usize,
168                            (frequency - queries[query].0) as usize,
169                        );
170                    }
171                }
172                if position < n {
173                    count[self.array[position] as usize] += 1;
174                }
175            }
176            return;
177        }
178        let mut processor = RangeFrequencyProcessor::new(self.array.len());
179        for (index, value) in self.array.into_iter().enumerate() {
180            self.events.push((
181                value,
182                RangeFrequencyQuery::Remove {
183                    index: index as u32,
184                },
185            ));
186        }
187        let mut offsets = vec![0; self.queried.len() + 1];
188        for &(value, _) in &self.events {
189            offsets[value as usize + 1] += self.queried[value as usize] as usize;
190        }
191        for i in 0..self.queried.len() {
192            offsets[i + 1] += offsets[i];
193        }
194        let mut next = offsets.clone();
195        let mut events = vec![RangeFrequencyQuery::Add { index: 0 }; *offsets.last().unwrap()];
196        for (value, event) in self.events {
197            let value = value as usize;
198            if self.queried[value] != 0 {
199                events[next[value]] = event;
200                next[value] += 1;
201            }
202        }
203        for range in offsets.windows(2) {
204            for &query in &events[range[0]..range[1]] {
205                match query {
206                    RangeFrequencyQuery::Add { index } => {
207                        processor.add(index);
208                    }
209                    RangeFrequencyQuery::Remove { index } => {
210                        processor.remove(index);
211                    }
212                    RangeFrequencyQuery::Query {
213                        left,
214                        right,
215                        output_index,
216                    } => {
217                        callback(output_index as usize, processor.query(left, right));
218                    }
219                }
220            }
221        }
222    }
Source

fn remove(&mut self, index: u32)

Examples found in repository?
crates/competitive/src/data_structure/range_frequency.rs (line 210)
127    pub fn execute_with_callback(mut self, mut callback: impl FnMut(usize, usize)) {
128        for output_index in self.zero_queries {
129            callback(output_index as usize, 0);
130        }
131        if let Some(mut queries) = self.static_queries.take() {
132            let n = self.array.len();
133            if queries.is_empty() {
134                return;
135            }
136            let mut offsets = vec![0; n + 2];
137            for &(left, right, _, _) in &queries {
138                if left < right {
139                    offsets[left as usize + 1] += 1;
140                    offsets[right as usize + 1] += 1;
141                }
142            }
143            for i in 0..=n {
144                offsets[i + 1] += offsets[i];
145            }
146            let mut next = offsets.clone();
147            let mut events = vec![0u32; 2 * queries.len()];
148            for (i, &(left, right, _, output_index)) in queries.iter().enumerate() {
149                if left >= right {
150                    callback(output_index as usize, 0);
151                    continue;
152                }
153                for (side, position) in [left, right].into_iter().enumerate() {
154                    events[next[position as usize]] = (2 * i + side) as u32;
155                    next[position as usize] += 1;
156                }
157            }
158            let mut count = vec![0u32; self.values.len()];
159            for position in 0..=n {
160                for &endpoint in &events[offsets[position]..offsets[position + 1]] {
161                    let query = (endpoint >> 1) as usize;
162                    let frequency = count[queries[query].2 as usize];
163                    if endpoint & 1 == 0 {
164                        queries[query].0 = frequency;
165                    } else {
166                        callback(
167                            queries[query].3 as usize,
168                            (frequency - queries[query].0) as usize,
169                        );
170                    }
171                }
172                if position < n {
173                    count[self.array[position] as usize] += 1;
174                }
175            }
176            return;
177        }
178        let mut processor = RangeFrequencyProcessor::new(self.array.len());
179        for (index, value) in self.array.into_iter().enumerate() {
180            self.events.push((
181                value,
182                RangeFrequencyQuery::Remove {
183                    index: index as u32,
184                },
185            ));
186        }
187        let mut offsets = vec![0; self.queried.len() + 1];
188        for &(value, _) in &self.events {
189            offsets[value as usize + 1] += self.queried[value as usize] as usize;
190        }
191        for i in 0..self.queried.len() {
192            offsets[i + 1] += offsets[i];
193        }
194        let mut next = offsets.clone();
195        let mut events = vec![RangeFrequencyQuery::Add { index: 0 }; *offsets.last().unwrap()];
196        for (value, event) in self.events {
197            let value = value as usize;
198            if self.queried[value] != 0 {
199                events[next[value]] = event;
200                next[value] += 1;
201            }
202        }
203        for range in offsets.windows(2) {
204            for &query in &events[range[0]..range[1]] {
205                match query {
206                    RangeFrequencyQuery::Add { index } => {
207                        processor.add(index);
208                    }
209                    RangeFrequencyQuery::Remove { index } => {
210                        processor.remove(index);
211                    }
212                    RangeFrequencyQuery::Query {
213                        left,
214                        right,
215                        output_index,
216                    } => {
217                        callback(output_index as usize, processor.query(left, right));
218                    }
219                }
220            }
221        }
222    }
Source

fn query(&self, left: u32, right: u32) -> usize

Examples found in repository?
crates/competitive/src/data_structure/range_frequency.rs (line 217)
127    pub fn execute_with_callback(mut self, mut callback: impl FnMut(usize, usize)) {
128        for output_index in self.zero_queries {
129            callback(output_index as usize, 0);
130        }
131        if let Some(mut queries) = self.static_queries.take() {
132            let n = self.array.len();
133            if queries.is_empty() {
134                return;
135            }
136            let mut offsets = vec![0; n + 2];
137            for &(left, right, _, _) in &queries {
138                if left < right {
139                    offsets[left as usize + 1] += 1;
140                    offsets[right as usize + 1] += 1;
141                }
142            }
143            for i in 0..=n {
144                offsets[i + 1] += offsets[i];
145            }
146            let mut next = offsets.clone();
147            let mut events = vec![0u32; 2 * queries.len()];
148            for (i, &(left, right, _, output_index)) in queries.iter().enumerate() {
149                if left >= right {
150                    callback(output_index as usize, 0);
151                    continue;
152                }
153                for (side, position) in [left, right].into_iter().enumerate() {
154                    events[next[position as usize]] = (2 * i + side) as u32;
155                    next[position as usize] += 1;
156                }
157            }
158            let mut count = vec![0u32; self.values.len()];
159            for position in 0..=n {
160                for &endpoint in &events[offsets[position]..offsets[position + 1]] {
161                    let query = (endpoint >> 1) as usize;
162                    let frequency = count[queries[query].2 as usize];
163                    if endpoint & 1 == 0 {
164                        queries[query].0 = frequency;
165                    } else {
166                        callback(
167                            queries[query].3 as usize,
168                            (frequency - queries[query].0) as usize,
169                        );
170                    }
171                }
172                if position < n {
173                    count[self.array[position] as usize] += 1;
174                }
175            }
176            return;
177        }
178        let mut processor = RangeFrequencyProcessor::new(self.array.len());
179        for (index, value) in self.array.into_iter().enumerate() {
180            self.events.push((
181                value,
182                RangeFrequencyQuery::Remove {
183                    index: index as u32,
184                },
185            ));
186        }
187        let mut offsets = vec![0; self.queried.len() + 1];
188        for &(value, _) in &self.events {
189            offsets[value as usize + 1] += self.queried[value as usize] as usize;
190        }
191        for i in 0..self.queried.len() {
192            offsets[i + 1] += offsets[i];
193        }
194        let mut next = offsets.clone();
195        let mut events = vec![RangeFrequencyQuery::Add { index: 0 }; *offsets.last().unwrap()];
196        for (value, event) in self.events {
197            let value = value as usize;
198            if self.queried[value] != 0 {
199                events[next[value]] = event;
200                next[value] += 1;
201            }
202        }
203        for range in offsets.windows(2) {
204            for &query in &events[range[0]..range[1]] {
205                match query {
206                    RangeFrequencyQuery::Add { index } => {
207                        processor.add(index);
208                    }
209                    RangeFrequencyQuery::Remove { index } => {
210                        processor.remove(index);
211                    }
212                    RangeFrequencyQuery::Query {
213                        left,
214                        right,
215                        output_index,
216                    } => {
217                        callback(output_index as usize, processor.query(left, right));
218                    }
219                }
220            }
221        }
222    }

Trait Implementations§

Source§

impl Clone for RangeFrequencyProcessor

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 Debug for RangeFrequencyProcessor

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

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.