competitive/algorithm/
other.rs1#[codesnip::entry]
2pub fn run_length_encoding<T, I>(iter: I) -> Vec<(T, usize)>
4where
5 T: Clone + PartialEq,
6 I: IntoIterator<Item = T>,
7{
8 let mut res = Vec::new();
9 for a in iter.into_iter() {
10 if let Some((p, len)) = res.last_mut() {
11 if p == &a {
12 *len += 1;
13 continue;
14 }
15 }
16 res.push((a, 1));
17 }
18 res
19}
20
21#[codesnip::entry]
22pub fn floor_kernel(n: usize) -> Vec<usize> {
26 let m = (n as f64).sqrt() as usize;
27 let mut res = Vec::with_capacity(m * 2 + 1);
28 for i in 1..=m {
29 res.push(i);
30 }
31 if n / m + 1 != m + 1 {
32 res.push(m + 1);
33 }
34 for i in (1..=m).rev() {
35 res.push(n / i + 1);
36 }
37 res
38}
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43 use crate::{rand, tools::Xorshift};
44
45 #[test]
46 fn test_run_length_encoding() {
47 let mut rng = Xorshift::default();
48 const N: usize = 100_000;
49 rand!(rng, v: [0u8..8u8; N]);
50 let r = run_length_encoding(v.iter());
51 let mut s = 0;
52 for (a, l) in r {
53 for v in &v[s..s + l] {
54 assert_eq!(a, v);
55 }
56 s += l;
57 }
58 }
59
60 #[test]
61 fn test_floor_kernel() {
62 for n in 1..1000 {
63 let k = floor_kernel(n);
64 let from = k.iter().cloned().zip(k.iter().cloned().skip(1));
65 let to = k.iter().cloned().zip(k.iter().cloned().skip(1)).rev();
66 for ((a, b), (c, d)) in from.zip(to) {
67 assert!(a < b);
68 assert!(c < d);
69 for x in a..b {
70 for y in c..d {
71 assert!(x * y <= n);
72 }
73 }
74 }
75 }
76 }
77}