diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 392487b..ec47821 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -666,3 +666,5 @@ mod p1931_painting_a_grid_with_three_different_colors; mod p3024_type_of_triangle; mod p3355_zero_array_transformation_i; + +mod p3356_zero_array_transformation_ii; diff --git a/src/problem/p3356_zero_array_transformation_ii.rs b/src/problem/p3356_zero_array_transformation_ii.rs new file mode 100644 index 0000000..7ef10af --- /dev/null +++ b/src/problem/p3356_zero_array_transformation_ii.rs @@ -0,0 +1,71 @@ +/** + * [3356] Zero Array Transformation II + */ +pub struct Solution {} + +// submission codes start here + +impl Solution { + pub fn min_zero_array(nums: Vec, queries: Vec>) -> i32 { + let (mut left, mut right) = (0, queries.len()); + + if !Self::check(&nums, &queries, right) { + return -1; + } + + while left < right { + let k = (left + right) / 2; + if Self::check(&nums, &queries, k) { + right = k; + } else { + left = k + 1; + } + } + + left as i32 + } + + fn check(nums: &Vec, queries: &Vec>, k: usize) -> bool { + let n = nums.len(); + let mut difference_array = vec![0; n + 1]; + + for query in queries[..k].iter() { + difference_array[query[0] as usize] += query[2]; + difference_array[query[1] as usize + 1] -= query[2]; + } + + let mut prefix_sum = difference_array[0]; + + for (i, &v) in difference_array[1..].iter().enumerate() { + if prefix_sum < nums[i] { + return false; + } + + prefix_sum += v; + } + + true + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_3356() { + assert_eq!( + 2, + Solution::min_zero_array( + vec![2, 0, 2], + vec![vec![0, 2, 1], vec![0, 2, 1], vec![1, 1, 3]] + ) + ); + assert_eq!( + -1, + Solution::min_zero_array(vec![4, 3, 2, 1], vec![vec![1, 3, 2], vec![0, 2, 1]]) + ); + } +}