struct RangeFrequencyProcessor {
bit: BinaryIndexedTree<AdditiveOperation<i32>>,
data: Vec<u64>,
}Fields§
§bit: BinaryIndexedTree<AdditiveOperation<i32>>§data: Vec<u64>Implementations§
Source§impl RangeFrequencyProcessor
impl RangeFrequencyProcessor
Sourcefn new(size: usize) -> Self
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 }Sourcefn add(&mut self, index: u32)
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 }Sourcefn remove(&mut self, index: u32)
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 }Sourcefn query(&self, left: u32, right: u32) -> usize
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
impl Clone for RangeFrequencyProcessor
Auto Trait Implementations§
impl Freeze for RangeFrequencyProcessor
impl RefUnwindSafe for RangeFrequencyProcessor
impl Send for RangeFrequencyProcessor
impl Sync for RangeFrequencyProcessor
impl Unpin for RangeFrequencyProcessor
impl UnsafeUnpin for RangeFrequencyProcessor
impl UnwindSafe for RangeFrequencyProcessor
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