C# Fish
static int Fish(int[] a, int[] b)
{
var size = a.Length;
var dead = 0;
var fish = new Stack<int>();
for (int i = 0; i < size; i++)
{
if (b[i] == 1)
{
fish.Push(a[i]);
}
else
{
while (fish.Count > 0)
{
dead++;
if (a[i] > fish.Peek())
{
fish.Pop();
}
else
{
break;
}
}
}
}
return size - dead;
}
This uses a stack for downstream fish and resolves fights only when opposite directions meet.