diff --git a/src/problem/mod.rs b/src/problem/mod.rs index ec47821..792a436 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -668,3 +668,5 @@ mod p3024_type_of_triangle; mod p3355_zero_array_transformation_i; mod p3356_zero_array_transformation_ii; + +mod p3362_zero_array_transformation_iii; diff --git a/src/problem/p3362_zero_array_transformation_iii.rs b/src/problem/p3362_zero_array_transformation_iii.rs new file mode 100644 index 0000000..0317f84 --- /dev/null +++ b/src/problem/p3362_zero_array_transformation_iii.rs @@ -0,0 +1,73 @@ +/** + * [3362] Zero Array Transformation III + */ +pub struct Solution {} + +// submission codes start here +use std::collections::BinaryHeap; + +impl Solution { + pub fn max_removal(nums: Vec, mut queries: Vec>) -> i32 { + queries.sort_unstable_by(|a, b| a[0].cmp(&b[0])); + + let mut heap = BinaryHeap::new(); + let mut difference_array = vec![0; nums.len() + 1]; + let mut prefix_sum = 0; + let mut pos = 0; + + for i in 0..nums.len() { + prefix_sum += difference_array[i]; + + while pos < queries.len() && queries[pos][0] as usize == i { + heap.push(queries[pos][1] as usize); + pos += 1; + } + + while prefix_sum < nums[i] { + if let Some(&right) = heap.peek() { + if right >= i { + prefix_sum += 1; + difference_array[right + 1] -= 1; + heap.pop(); + } else { + break; + } + } else { + break; + } + } + + if prefix_sum < nums[i] { + return -1; + } + } + + heap.len() as i32 + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_3362() { + assert_eq!( + 1, + Solution::max_removal(vec![2, 0, 2], vec![vec![0, 2], vec![0, 2], vec![1, 1]]) + ); + assert_eq!( + 2, + Solution::max_removal( + vec![1, 1, 1, 1], + vec![vec![1, 3], vec![0, 2], vec![1, 3], vec![1, 2]] + ) + ); + assert_eq!( + -1, + Solution::max_removal(vec![1, 2, 3, 4], vec![vec![0, 3]]) + ); + } +}