Rust Fish
fn fish(a: &[i64], b: &[i64]) -> i64 {
let size = a.len();
let mut dead = 0i64;
let mut fish: Vec<i64> = Vec::new();
for i in 0..size {
if b[i] == 1 {
fish.push(a[i]);
} else if !fish.is_empty() {
while let Some(&last) = fish.last() {
dead += 1;
if a[i] > last {
fish.pop();
} else {
break;
}
}
}
}
size as i64 - dead
}
This uses a stack for downstream fish and resolves fights only when opposite directions meet.