Skip to main content

array/
lib.rs

1//! # Array
2
3#![feature(test)]
4
5extern crate test;
6
7/// 73m Set Matrix Zeroes
8struct Sol73 {}
9
10impl Sol73 {
11    /// -2^31 <= M_ij <= 2^31-1
12    /// 1 <= M, N <= 200
13    pub fn set_zeroes(matrix: &mut [Vec<i32>]) {
14        let (rows, cols) = (matrix.len(), matrix[0].len());
15
16        let zero_row0 = matrix[0].contains(&0);
17        let zero_col0 = matrix.iter().any(|row| row[0] == 0);
18
19        for r in 1..rows {
20            for c in 1..cols {
21                if matrix[r][c] == 0 {
22                    (matrix[0][c], matrix[r][0]) = (0, 0);
23                }
24            }
25        }
26
27        for r in 1..rows {
28            for c in 1..cols {
29                if matrix[0][c] == 0 || matrix[r][0] == 0 {
30                    matrix[r][c] = 0;
31                }
32            }
33        }
34
35        if zero_col0 {
36            for row in matrix.iter_mut() {
37                row[0] = 0;
38            }
39        }
40        if zero_row0 {
41            for v in matrix[0].iter_mut() {
42                *v = 0;
43            }
44        }
45    }
46}
47
48/// 747 Largest Number At Least Twice of Others
49struct Sol747 {}
50
51impl Sol747 {
52    /// 0 <= N_i <= 100
53    pub fn dominant_index(nums: Vec<i32>) -> i32 {
54        let xv = nums.iter().max().unwrap_or(&-1);
55
56        if nums.iter().filter(|&n| n != xv).all(|n| 2 * n <= *xv) {
57            return nums.iter().position(|n| n == xv).unwrap() as i32;
58        }
59
60        -1
61    }
62}
63
64/// 766 Toeplitz Matrix
65struct Sol766 {}
66
67impl Sol766 {
68    pub fn is_toeplitz_matrix(matrix: Vec<Vec<i32>>) -> bool {
69        matrix
70            .iter()
71            .zip(matrix.iter().skip(1))
72            .all(|(tr, br)| tr.iter().zip(br.iter().skip(1)).all(|(lv, rv)| lv == rv))
73    }
74}
75
76/// 798h Smallest Rotation with Highest Score
77struct Sol798 {}
78
79impl Sol798 {
80    /// 1 <= L <= 10^5
81    /// 0 <= N_i < L
82    pub fn best_rotation(nums: Vec<i32>) -> i32 {
83        let n = nums.len();
84
85        let mut scores = vec![0; n];
86        for (i, &p) in nums.iter().enumerate() {
87            let (left, right) = ((n + i - p as usize + 1) % n, (i + 1) % n);
88            scores[left] -= 1;
89            scores[right] += 1;
90            if left > right {
91                scores[0] -= 1;
92            }
93        }
94
95        let (mut cur, mut best) = (0, -(n as i32));
96        scores.into_iter().enumerate().fold(0, |x, (i, score)| {
97            cur += score;
98            if cur > best {
99                best = cur;
100                i
101            } else {
102                x
103            }
104        }) as _
105    }
106}
107
108/// 1184 Distance Between Bus Stops
109struct Sol1184;
110
111impl Sol1184 {
112    pub fn distance_between_bus_stops(distance: Vec<i32>, start: i32, destination: i32) -> i32 {
113        let (mut src, mut dst) = (start as usize, destination as usize);
114        if src > dst {
115            (src, dst) = (dst, src);
116        }
117
118        distance[src..dst]
119            .iter()
120            .sum::<i32>()
121            .min(distance[dst..].iter().chain(distance[..src].iter()).sum())
122    }
123}
124
125/// 1394 Find Lucky Integer in an Array
126struct Sol1394;
127
128impl Sol1394 {
129    /// 1 <= N, N_i <= 500
130    pub fn find_lucky(arr: Vec<i32>) -> i32 {
131        let mut freqs = [0; 500 + 1];
132        for n in arr {
133            freqs[n as usize] += 1;
134        }
135
136        freqs
137            .iter()
138            .enumerate()
139            .rev()
140            .filter(|(_, f)| **f > 0)
141            .find(|(n, f)| *f == n)
142            .map(|(n, _)| n as i32)
143            .unwrap_or(-1)
144    }
145}
146
147/// 1450 Number of Students Doing Homework at a Given Time
148struct Sol1450 {}
149impl Sol1450 {
150    pub fn busy_student(start_time: Vec<i32>, end_time: Vec<i32>, query_time: i32) -> i32 {
151        start_time
152            .iter()
153            .zip(end_time.iter())
154            .fold(0, |count, (s, e)| {
155                if *s <= query_time && query_time <= *e {
156                    count + 1
157                } else {
158                    count
159                }
160            })
161    }
162}
163
164/// 1534 Count Good Triplets
165struct Sol1534;
166
167impl Sol1534 {
168    /// O(N^3)
169    pub fn count_good_triplets(arr: Vec<i32>, a: i32, b: i32, c: i32) -> i32 {
170        let mut count = 0;
171        for (i, x) in arr.iter().enumerate() {
172            for (j, y) in arr.iter().enumerate().skip(i + 1) {
173                if (x - y).abs() <= a {
174                    for z in arr.iter().skip(j + 1) {
175                        if (y - z).abs() <= b && (z - x).abs() <= c {
176                            count += 1;
177                        }
178                    }
179                }
180            }
181        }
182
183        count
184    }
185}
186
187/// 1550 Three Consecutive Odds
188struct Sol1550;
189
190impl Sol1550 {
191    pub fn three_consecutive_odds(arr: Vec<i32>) -> bool {
192        arr.windows(3)
193            .inspect(|v| println!("-> {:?}", v))
194            .any(|v| v[0] & v[1] & v[2] & 1 == 1)
195    }
196}
197
198/// 1752 Check If Array Is Sorted and Rotated
199struct Sol1752;
200
201impl Sol1752 {
202    pub fn check(nums: Vec<i32>) -> bool {
203        println!(" * {:?}", nums);
204        println!(
205            ":: {}",
206            nums.windows(2).fold(
207                if nums[0] < nums[nums.len() - 1] { 1 } else { 0 },
208                |r, v| if v[1] < v[0] { r + 1 } else { r }
209            ) <= 1
210        );
211
212        let mut nums = nums;
213        let Some(pinv) = nums.windows(2).position(|v| v[1] < v[0]) else {
214            return true;
215        };
216
217        nums.rotate_left(pinv + 1);
218        nums.windows(2).all(|v| v[0] <= v[1])
219    }
220}
221
222/// 1796 Second Largest Digit in a String
223struct Sol1796 {}
224
225impl Sol1796 {
226    pub fn second_highest(s: String) -> i32 {
227        s.chars()
228            .fold((-1, -1), |(x, x2), chr| match chr {
229                '0'..='9' => {
230                    let d = ('0'..='9').position(|x| x == chr).unwrap() as i32;
231                    if d == x {
232                        (x, x2)
233                    } else if x < d {
234                        (d, x)
235                    } else if x2 < d {
236                        (x, d)
237                    } else {
238                        (x, x2)
239                    }
240                }
241                _ => (x, x2),
242            })
243            .1
244    }
245}
246
247/// 1800 Maximum Possible Ascending Subarray Sum
248struct Sol1800;
249
250impl Sol1800 {
251    pub fn max_ascending_sum(nums: Vec<i32>) -> i32 {
252        nums.windows(2)
253            .fold((nums[0], nums[0]), |mut kadan, v| {
254                if v[1] > v[0] {
255                    kadan.0 += v[1];
256                } else {
257                    kadan.0 = v[1];
258                }
259                kadan.1 = kadan.1.max(kadan.0);
260
261                kadan
262            })
263            .1
264    }
265}
266
267/// 1920 Build Array from Permutation
268struct Sol1920;
269
270impl Sol1920 {
271    /// 1 <= N <= 1000, 0 <= N_i < N
272    pub fn build_array(nums: Vec<i32>) -> Vec<i32> {
273        println!("** {:?}", nums);
274
275        fn in_place(nums: Vec<i32>) -> Vec<i32> {
276            let mut nums = nums;
277            for i in 0..nums.len() {
278                nums[i] += 1000 * (nums[nums[i] as usize] % 1000);
279            }
280            for n in nums.iter_mut() {
281                *n /= 1000;
282            }
283
284            nums
285        }
286        println!(":: {:?}", in_place(nums.to_vec()));
287
288        nums.iter().fold(vec![], |mut v, &n| {
289            v.push(nums[n as usize]);
290            v
291        })
292    }
293}
294
295/// 2016 Maximum Difference Between Increasing Elements
296struct Sol2016 {}
297
298impl Sol2016 {
299    pub fn maximum_difference(nums: Vec<i32>) -> i32 {
300        let mut vmin = nums[0];
301        let mut xdiff = -1;
302
303        for n in nums.into_iter().skip(1) {
304            if n > vmin {
305                xdiff = xdiff.max(n - vmin);
306            }
307            vmin = vmin.min(n);
308        }
309
310        xdiff
311    }
312}
313
314/// 2017m Grid Game
315struct Sol2017;
316
317impl Sol2017 {
318    pub fn grid_game(grid: Vec<Vec<i32>>) -> i64 {
319        let mut top = grid[0].iter().map(|&n| n as i64).sum::<i64>();
320        let mut bottom = 0;
321
322        (0..grid[0].len()).fold(i64::MAX, |mx, i| {
323            top -= grid[0][i] as i64;
324            bottom += grid[1][i] as i64;
325            mx.min(top.max(bottom - grid[1][i] as i64))
326        })
327    }
328}
329
330/// 2033m Minimum Operations to Make a Uni-Value Grid
331struct Sol2033;
332
333impl Sol2033 {
334    pub fn min_operations(grid: Vec<Vec<i32>>, x: i32) -> i32 {
335        let mut nums = vec![];
336        for r in 0..grid.len() {
337            for c in 0..grid[0].len() {
338                nums.push(grid[r][c]);
339            }
340        }
341
342        nums.sort_unstable();
343        let median = nums[nums.len() / 2];
344
345        println!("-> {:?}", (&nums, median));
346
347        let r = median % x;
348        let mut ops = 0;
349        for n in nums {
350            if n % x != r {
351                return -1;
352            }
353            ops += (n - median).abs() / x;
354        }
355
356        ops
357    }
358}
359
360/// 2094 Finding 3-Digit Even Numbers
361struct Sol2094;
362
363impl Sol2094 {
364    pub fn find_even_numbers(digits: Vec<i32>) -> Vec<i32> {
365        let mut freq = [0; 10];
366        digits.iter().for_each(|&d| freq[d as usize] += 1);
367
368        println!("-> {:?}", freq);
369
370        let mut evens = vec![];
371        for h in 1..=9 {
372            if freq[h] == 0 {
373                continue;
374            }
375            freq[h] -= 1;
376            for t in 0..=9 {
377                if freq[t] == 0 {
378                    continue;
379                }
380                freq[t] -= 1;
381                for o in (0..=8).step_by(2) {
382                    if freq[o] > 0 {
383                        evens.push((100 * h + 10 * t + o) as i32);
384                    }
385                }
386                freq[t] += 1;
387            }
388            freq[h] += 1;
389        }
390
391        evens
392    }
393}
394
395/// 2099 Find Subsequence of Length K With the Largest Sum
396struct Sol2099 {}
397
398impl Sol2099 {
399    pub fn max_subsequence(nums: Vec<i32>, k: i32) -> Vec<i32> {
400        use std::cmp::Reverse;
401
402        let mut sorted: Vec<_> = nums.iter().enumerate().collect();
403        sorted.sort_by_key(|(_, n)| Reverse(*n));
404        println!("-> {sorted:?}");
405
406        sorted[0..k as usize].sort();
407        println!("-> {sorted:?}");
408
409        sorted[0..k as usize].iter().map(|(_, n)| **n).collect()
410    }
411}
412
413/// 2145m Count the Hidden Sequences
414struct Sol2145;
415
416impl Sol2145 {
417    /// 1 <= N <= 10^5, -10^5 <= N_i <= 10^5
418    pub fn number_of_arrays(differences: Vec<i32>, lower: i32, upper: i32) -> i32 {
419        let (mut x, mut n) = (0, 0);
420        let mut v = 0;
421        for diff in differences {
422            v += diff;
423            x = x.max(v);
424            n = n.min(v);
425
426            if x - n > upper - lower {
427                return 0;
428            }
429        }
430
431        upper - lower - (x - n) + 1
432    }
433}
434
435/// 2176 Count Equal and Divisible Pairs in an Array
436struct Sol2176;
437
438impl Sol2176 {
439    pub fn count_pairs(nums: Vec<i32>, k: i32) -> i32 {
440        let mut count = 0;
441        for (i, &x) in nums.iter().enumerate().take(nums.len() - 1) {
442            for (j, &y) in nums.iter().enumerate().skip(i + 1) {
443                if x == y && (i * j).is_multiple_of(k as usize) {
444                    count += 1;
445                }
446            }
447        }
448
449        count
450    }
451}
452
453/// 2190 Most Frequent Number Following Key In an Array
454struct Sol2190 {}
455
456impl Sol2190 {
457    pub fn most_frequent(nums: Vec<i32>, key: i32) -> i32 {
458        use std::collections::HashMap;
459
460        let mut freqs = HashMap::new();
461        for w in nums.windows(2) {
462            if w[0] == key {
463                freqs.entry(w[1]).and_modify(|f| *f += 1).or_insert(1);
464            }
465        }
466
467        println!(
468            ":? {}",
469            freqs.iter().max_by_key(|&(_, f)| f).map_or(0, |(&n, _)| n)
470        );
471
472        let xfreq = freqs.values().max().unwrap();
473        *freqs.iter().find(|(_, f)| *f == xfreq).unwrap().0
474    }
475}
476
477/// 2200 Find All K-Distant Indices in an Array
478struct Sol2200 {}
479
480impl Sol2200 {
481    pub fn find_k_distant_indices(nums: Vec<i32>, key: i32, k: i32) -> Vec<i32> {
482        let k = k as usize;
483        let mut l = 0;
484        nums.iter()
485            .enumerate()
486            .filter(|(_, n)| **n == key)
487            .fold(vec![], |mut kdists, (r, _)| {
488                for i in l.max(r.saturating_sub(k))..=(r + k).min(nums.len() - 1) {
489                    kdists.push(i as i32);
490                }
491                l = r + k + 1;
492
493                kdists
494            })
495    }
496}
497
498/// 2210 Count Hills and Valleys in an Array
499struct Sol2210 {}
500
501impl Sol2210 {
502    pub fn count_hill_valley(mut nums: Vec<i32>) -> i32 {
503        nums.dedup();
504        println!("-> {nums:?}");
505
506        nums.windows(3).fold(0, |count, w| {
507            if w[0] < w[1] && w[1] > w[2] || w[0] > w[1] && w[1] < w[2] {
508                count + 1
509            } else {
510                count
511            }
512        })
513    }
514}
515
516/// 2248 Intersection of Multiple Array
517struct Sol2248 {}
518
519impl Sol2248 {
520    pub fn intersection(nums: Vec<Vec<i32>>) -> Vec<i32> {
521        use std::collections::BTreeMap;
522
523        let mut freqs = BTreeMap::new();
524        for nums in &nums {
525            for n in nums {
526                freqs.entry(n).and_modify(|f| *f += 1).or_insert(1);
527            }
528        }
529
530        freqs
531            .into_iter()
532            .filter(|(_, f)| *f == nums.len())
533            .map(|(&n, _)| n)
534            .collect::<Vec<_>>()
535    }
536}
537
538/// 2341 Maximum Number of Pairs in Array
539struct Sol2341 {}
540
541impl Sol2341 {
542    pub fn number_of_pairs(mut nums: Vec<i32>) -> Vec<i32> {
543        nums.sort_unstable();
544
545        let (pairs, leftovers) = nums
546            .chunk_by(PartialEq::eq)
547            .fold((0, 0), |(pairs, leftovers), chunk| {
548                (pairs + chunk.len() / 2, leftovers + (chunk.len() & 1))
549            });
550
551        vec![pairs as i32, leftovers as i32]
552    }
553}
554
555/// 2419m Longest Subarray With Maximum Bitwise AND
556struct Sol2419 {}
557
558impl Sol2419 {
559    pub fn longest_subarray(nums: Vec<i32>) -> i32 {
560        let (mut x, mut cur) = (0, 0);
561
562        nums.iter().fold(0, |mut x_len, &n| {
563            if x < n {
564                x = n;
565                (x_len, cur) = (0, 0);
566            }
567
568            if x == n {
569                cur += 1;
570            } else {
571                cur = 0;
572            }
573
574            x_len.max(cur)
575        })
576    }
577}
578
579/// 2536m Increment Submatrices by One
580struct Sol2536 {}
581
582impl Sol2536 {
583    pub fn range_add_queries(n: i32, queries: Vec<Vec<i32>>) -> Vec<Vec<i32>> {
584        let n = n as usize;
585
586        let diffs = queries
587            .iter()
588            .fold(vec![vec![0; n + 1]; n + 1], |mut diffs, query| {
589                let [r1, c1, r2, c2, ..] = query[..] else {
590                    panic!()
591                };
592
593                let (r1, r2, c1, c2) = (r1 as usize, r2 as usize, c1 as usize, c2 as usize);
594
595                diffs[r1][c1] += 1;
596                diffs[r2 + 1][c1] -= 1;
597                diffs[r1][c2 + 1] -= 1;
598                diffs[r2 + 1][c2 + 1] += 1;
599
600                diffs
601            });
602
603        println!("-> {diffs:?}");
604
605        let mut matrix = vec![vec![0; n as usize]; n as usize];
606        for r in 0..n {
607            for c in 0..n {
608                let left = if r == 0 { 0 } else { matrix[r - 1][c] };
609                let above = if c == 0 { 0 } else { matrix[r][c - 1] };
610                let diagonal = if r == 0 || c == 0 {
611                    0
612                } else {
613                    matrix[r - 1][c - 1]
614                };
615
616                matrix[r][c] = diffs[r][c] + left + above - diagonal;
617            }
618        }
619
620        matrix
621    }
622}
623
624/// 2780m Minimum Index of a Valid Split
625struct Sol2780;
626
627impl Sol2780 {
628    pub fn minimum_index(nums: Vec<i32>) -> i32 {
629        let mut copy = nums.to_vec();
630        copy.sort_unstable();
631
632        let (mut dominent, mut frq) = (0, 0);
633        copy.iter().fold((0, 0), |(d, mut f), &n| {
634            if d == n {
635                f += 1;
636            } else {
637                f = 1;
638            }
639
640            if f > frq {
641                frq = f;
642                dominent = n;
643            }
644
645            (n, f)
646        });
647
648        println!("-> {:?}", (dominent, frq));
649
650        let mut f = 0;
651        for (i, &n) in nums.iter().enumerate() {
652            if n == dominent {
653                f += 1;
654            }
655
656            if f > i.div_ceil(2) && (frq - f) > (nums.len() - i - 1) / 2 {
657                return i as i32;
658            }
659        }
660
661        -1
662    }
663
664    /// Majority Voting Algorithm: Boyer-Moore
665    #[expect(non_snake_case)]
666    fn Boyer_Moore(nums: Vec<i32>) -> i32 {
667        nums.iter()
668            .fold((nums[0], 0), |(mut majority, mut frq), &n| {
669                if n == majority {
670                    frq += 1;
671                } else {
672                    frq -= 1;
673                }
674
675                if frq == 0 {
676                    majority = n;
677                }
678
679                (majority, frq)
680            })
681            .0
682    }
683}
684
685/// 2873 Maximum Value of an Ordered Triplet I
686struct Sol2873;
687
688impl Sol2873 {
689    pub fn maximum_triplet_value(nums: Vec<i32>) -> i64 {
690        let mut value = -1;
691        for i in 0..nums.len() {
692            for j in i + 1..nums.len() {
693                for k in j + 1..nums.len() {
694                    value = value.max((nums[i] - nums[j]) as i64 * nums[k] as i64);
695                }
696            }
697        }
698
699        value.max(0)
700    }
701}
702
703/// 2874m Maximum Value of an Ordered Triplet II
704struct Sol2874;
705
706impl Sol2874 {
707    pub fn maximum_triplet_value(nums: Vec<i32>) -> i64 {
708        let mut value = 0;
709        let (mut lmax, mut diff) = (0, 0);
710        for n in nums {
711            value = value.max(diff as i64 * n as i64);
712
713            diff = diff.max(lmax - n);
714            lmax = lmax.max(n);
715        }
716
717        value
718    }
719}
720
721/// 2894 Divisible and Non-divisible Sums Difference
722struct Sol2894 {}
723
724impl Sol2894 {
725    pub fn difference_of_sums(n: i32, m: i32) -> i32 {
726        2 * (1..=n).filter(|&v| v % m != 0).sum::<i32>() - n * (n + 1) / 2
727    }
728}
729
730/// 2942 Find Words Containing Character
731struct Sol2942 {}
732
733impl Sol2942 {
734    pub fn find_words_containing(words: Vec<String>, x: char) -> Vec<i32> {
735        println!(
736            ":: {:?}",
737            words
738                .iter()
739                .enumerate()
740                .filter_map(|(i, word)| if word.contains(x) {
741                    Some(i as i32)
742                } else {
743                    None
744                })
745                .collect::<Vec<_>>()
746        );
747
748        words
749            .iter()
750            .enumerate()
751            .filter(|(_, word)| word.contains(x))
752            .map(|(i, _)| i as i32)
753            .collect()
754    }
755}
756
757/// 2946 Matrix Similarity After Cyclic Shifts
758struct Sol2946 {}
759
760impl Sol2946 {
761    pub fn are_similar(mat: Vec<Vec<i32>>, k: i32) -> bool {
762        let k = k as usize % mat[0].len();
763
764        mat.iter().enumerate().all(|(r, row)| {
765            row.iter()
766                .enumerate()
767                .all(|(c, &n)| n == mat[r][(c + k) % mat[0].len()])
768        })
769    }
770}
771
772/// 2966m Divide Array Into Arrays With Max Difference
773struct Sol2966 {}
774
775impl Sol2966 {
776    pub fn divide_array(mut nums: Vec<i32>, k: i32) -> Vec<Vec<i32>> {
777        nums.sort_unstable();
778        nums.chunks(3)
779            .map(|chk| {
780                if chk[2] - chk[0] > k {
781                    None
782                } else {
783                    Some(chk.to_vec())
784                }
785            })
786            .collect::<Option<Vec<Vec<i32>>>>()
787            .unwrap_or_default()
788    }
789}
790
791/// 3105 Longest Strictly Increasing or Strictly Decreasing Subarray
792struct Sol3105;
793
794impl Sol3105 {
795    pub fn longest_monotonic_subarray(nums: Vec<i32>) -> i32 {
796        let (mut asc, mut desc) = (0, 0);
797        nums.windows(2).fold([0, 0], |mut r, v| {
798            if v[0] > v[1] {
799                r[0] += 1;
800                desc = desc.max(r[0]);
801            } else {
802                r[0] = 0;
803            }
804            if v[1] > v[0] {
805                r[1] += 1;
806                asc = asc.max(r[1]);
807            } else {
808                r[1] = 0;
809            }
810            println!("{:?}", r);
811            r
812        });
813
814        println!(":: {:?}", asc.max(desc) + 1);
815
816        match (asc, desc) {
817            (0, 0) => 1,
818            _ => asc.max(desc) + 1,
819        }
820    }
821}
822
823/// 3151 Special Array I
824struct Sol3151;
825
826impl Sol3151 {
827    pub fn is_array_special(nums: Vec<i32>) -> bool {
828        nums.windows(2)
829            .fold(true, |r, v| if (v[0] ^ v[1]) & 1 == 0 { false } else { r })
830    }
831}
832
833/// 3169m Count Days Without Meetings
834struct Sol3169;
835
836impl Sol3169 {
837    pub fn count_days(days: i32, meetings: Vec<Vec<i32>>) -> i32 {
838        use std::collections::BTreeMap;
839
840        let mut meetings = meetings;
841        for meeting in meetings.iter_mut() {
842            meeting[1] += 1;
843        }
844
845        let mut sweep = BTreeMap::new();
846        for meeting in &meetings {
847            sweep
848                .entry(&meeting[0])
849                .and_modify(|f| *f += 1)
850                .or_insert(1);
851            sweep
852                .entry(&meeting[1])
853                .and_modify(|f| *f -= 1)
854                .or_insert(-1);
855        }
856
857        let days = days + 1;
858        sweep.entry(&days).or_insert(0);
859
860        println!("-> {:?}", (std::any::type_name_of_val(&sweep), &sweep));
861
862        let (mut cur_meeting, mut cur_day) = (0, 1);
863        sweep.iter().fold(0, |mut rst, (&day, &diff)| {
864            if cur_meeting == 0 {
865                rst += day - cur_day;
866            }
867            cur_meeting += diff;
868            cur_day = *day;
869
870            rst
871        })
872    }
873}
874
875/// 3195m Find the Minimum Area to Cover All Ones I
876struct Sol3195 {}
877
878impl Sol3195 {
879    pub fn minimum_area(grid: Vec<Vec<i32>>) -> i32 {
880        let (mut left, mut right) = (grid[0].len(), 0);
881        let (mut top, mut bottom) = (grid.len(), 0);
882
883        for (r, row) in grid.iter().enumerate() {
884            for (c, &n) in row.iter().enumerate() {
885                if n == 1 {
886                    left = left.min(c);
887                    right = right.max(c);
888
889                    top = top.min(r);
890                    bottom = bottom.max(r);
891                }
892            }
893        }
894
895        ((right - left + 1) * (bottom - top + 1)) as _
896    }
897}
898
899/// 3355m Zero Array Transformation I
900struct Sol3355 {}
901
902impl Sol3355 {
903    pub fn is_zero_array(nums: Vec<i32>, queries: Vec<Vec<i32>>) -> bool {
904        let mut diffs = vec![0; nums.len() + 1];
905        for query in queries {
906            diffs[query[0] as usize] += 1;
907            diffs[query[1] as usize + 1] -= 1;
908        }
909
910        let mut diffs_sum = vec![];
911        let mut sum = 0;
912        for diff in diffs {
913            sum += diff;
914            diffs_sum.push(sum);
915        }
916
917        println!("-> {diffs_sum:?}");
918
919        nums.into_iter()
920            .zip(diffs_sum)
921            .all(|(num, diff_sum)| num <= diff_sum)
922    }
923}
924
925/// 3392 Count Subarrays of Length Three With a Condition
926struct Sol3392;
927
928impl Sol3392 {
929    pub fn count_subarrays(nums: Vec<i32>) -> i32 {
930        println!(
931            ":: {}",
932            nums.to_vec().windows(3).fold(0, |count, v| {
933                if 2 * (v[0] + v[2]) == v[1] {
934                    count + 1
935                } else {
936                    count
937                }
938            })
939        );
940
941        let mut count = 0;
942        for i in 2..nums.len() {
943            if 2 * (nums[i - 2] + nums[i]) == nums[i - 1] {
944                count += 1;
945            }
946        }
947
948        count
949    }
950}
951
952/// 3394m Check if Grid can be Cut into Sections
953struct Sol3394;
954
955impl Sol3394 {
956    #[expect(unused_variables)]
957    pub fn check_valid_cuts(n: i32, mut rectangles: Vec<Vec<i32>>) -> bool {
958        let mut check = |offset| {
959            rectangles.sort_unstable_by_key(|v| v[offset]);
960
961            let mut gaps = 0;
962            rectangles
963                .iter()
964                .skip(1)
965                .fold(rectangles[0][offset + 2], |end: i32, rectangle| {
966                    if end <= rectangle[offset] {
967                        gaps += 1;
968                    }
969
970                    end.max(rectangle[offset + 2])
971                });
972
973            gaps >= 2
974        };
975
976        check(0) || check(1)
977    }
978}
979
980/// 3423 Maximum Difference Between Adjacent Elements in a Circular Array
981struct Sol3423 {}
982
983impl Sol3423 {
984    /// 2 <= N <= 100
985    pub fn max_adjacent_distance(nums: Vec<i32>) -> i32 {
986        println!(
987            ":: {}",
988            nums.iter()
989                .zip(nums.iter().cycle().skip(1))
990                .map(|(a, b)| (a - b).abs())
991                .max()
992                .unwrap()
993        );
994
995        nums.windows(2)
996            .fold((nums[0] - nums[nums.len() - 1]).abs(), |r, w| {
997                ((w[0] - w[1]).abs()).max(r)
998            })
999    }
1000}
1001
1002/// 3495m Minimum Operations to Make Array Elements Zero
1003struct Sol3495 {}
1004
1005impl Sol3495 {
1006    /// 1 <= Q <= 10^5
1007    /// 1 <= Q_0, Q_1 <= 10^9
1008    pub fn min_operations(queries: Vec<Vec<i32>>) -> i64 {
1009        // [1, n]
1010        let ops = |n| {
1011            let mut i = 1;
1012            let mut base = 1;
1013
1014            let mut ops = 0;
1015            while base <= n {
1016                ops += ((i + 1) >> 1) * (((base << 1) - 1).min(n) - base + 1);
1017                i += 1;
1018                base <<= 1;
1019            }
1020
1021            ops
1022        };
1023
1024        println!(
1025            ":? {}",
1026            queries
1027                .iter()
1028                .map(|qry| (qry[0] as i64, qry[1] as i64))
1029                .map(|(l, r)| (1..31)
1030                    .scan(1i64, |prv, power| {
1031                        let start = l.max(*prv);
1032                        let end = r.min(4 * *prv - 1);
1033                        *prv *= 4;
1034
1035                        let ops = if end >= start {
1036                            (end - start + 1) * power
1037                        } else {
1038                            0
1039                        };
1040
1041                        Some(ops)
1042                    })
1043                    .sum::<i64>())
1044                .map(|ops| (ops + 1) / 2)
1045                .sum::<i64>()
1046        );
1047
1048        queries
1049            .iter()
1050            .map(|v| (v[0] as i64, v[1] as i64))
1051            .fold(0, |m_ops, (l, r)| m_ops + (1 + ops(r) - ops(l - 1)) / 2)
1052    }
1053}
1054
1055#[cfg(test)]
1056mod tests;