Editorial for IOI '08 P3 - Fish
Submitting an official solution before solving the problem yourself is a bannable offence.
Observe that the order in which the fish eat each other is irrelevant. All that matters is whether the jewels of a given set of fish can be "united" into one fish (through the eating process described in the problem statement). We can arrive at the following lemma:
Lemma 1
The jewels that you get might be those of a given set of fish  if and only if the longest fish in 
 is at least twice as long as the second longest fish in 
.
Proof
If the longest fish in  cannot eat the second longest, their jewels can never be united unless a fish not in 
 is involved. If the longest fish is at least twice as long as the second longest, then the longest one can eat everyone else in 
 successively.
The tricky part of this problem is to avoid counting some possible combination of jewels more than once. One way to avoid this is to map every possible combination of jewels to the longest fish that can have that combination in its stomach. We then attempt to count, for each fish, the number of combinations mapped to it.
Note: For simplicity we will say that a fish, which was originally given a jewel of kind , is itself "a fish of kind 
".
Lemma 2
Unless a fish is the longest one of its kind, it will have no combinations mapped to it.
Proof
If we have a fish  of kind 
 and a longer fish 
 also of kind 
, then whatever can be eaten by 
 can also be eaten by 
. So any jewel set that's mapped to 
 can also involve the longer fish 
 instead of 
, which is a contradiction with the mapping method defined above.
Lemma 3
If the longest fish  of kind 
 can eat 
 fish of kind 
 and another fish 
 of kind 
 can eat more than 
 fish of kind 
, then no combinations that contain any jewel 
 would be mapped to the longest fish of kind 
. (Observe that in such a case the fish 
 must necessarily be longer than the fish 
.)
Proof
This is a similar case to the one above. Any such set that's mapped to the longest fish of kind  can also be found in the stomach of the longer fish of kind 
, leading to another contradiction.
Lemma 4
If the longest fish of kind  can eat 
 fish of kind 
 and another longer fish of kind 
 can also eat 
, but not 
 fish of kind 
, then the only combinations that can potentially be mapped to the longest fish of kind 
 would be ones which either have 
 jewels 
 or no jewels 
.
Proof
Again, using the superset principle we find out that if a combination has at most  jewels of kind 
 and at least one jewel of kind 
, then it can be found in the stomach of the longer fish of kind 
 and thus cannot be mapped to a fish of kind 
.
Knowing this, we can build an algorithm to tell us which combinations are mapped to a given fish.
Note: For simplicity we will denote by  the number of fish of kind 
 that can be eaten by the longest fish of kind 
.
Following lemma 2, we're only interested in the longest fish of their respective kind. For each such fish  of kind 
, we count two types of combinations that are mapped to it. First, combinations that have the maximum number of jewels of kind 
 (which is 
). These are called the "full" combinations. Second, all other combinations mapped to 
. These are called the "partial" combinations.
Now, for every other kind , with longest fish 
, we count how many jewels of kind 
 can be part of a "full" or a "partial" combination mapped to 
. The above lemmas give rise to three scenarios:
- If 
is more than
, meaning that
can eat more fish of kind
than
, then no jewels of kind
can be part of any combination mapped to
.
 - If 
is longer than
, but doesn't fall into the above category, there can be no jewels of kind
in the "partial" category of
, but there can be anywhere between
and
jewels in the "full" category.
 - If 
is shorter than
, then any number between
and
of fish of kind
can participate in either "full" or "partial" combinations of
.
 
Except for , the number of jewels of any two colors are independent of each other (i.e., the first count doesn't influence the feasibility of the second count in any way and vice versa).
A naïve implementation of this algorithm gives  running time since for each longest fish of its kind, we look through all other fish and determine the 
 values. This should be sufficient for 56 points.
We can improve the naïve implementation if we realize that we need only one loop over all the individual fish, as long as the fish are sorted by length. Then we can go from smallest to longest and count how many fish of each kind we have seen so far. We will use  to denote how many fish of kind 
 we have seen. Then when we reach the largest fish that can be eaten by a fish of kind 
, we have the values for 
 in the current values of 
. Implementing this properly yields an 
 algorithm with the 
 bottleneck being the sorting of the 
 fish and the 
 bottleneck being the evaluation of the products of the 
 numbers for each jewel kind. This solution is sufficient for 70~75 points.
We now work towards an  solution, which gets 100 points for this problem. The key observation here is that if we have the kinds sorted by the length of their respective longest fish, when we compute the number of combinations mapped to a given kind 
, all we do is add together a few numbers, each of which is a product of some consecutive 
 numbers (where "consecutive" refers to 
).
This means that we can achieve an  solution by keeping the array 
 (which at given times becomes 
 for each kind 
) in a data structure that allows us to modify the array in 
 time and to extract the product of a continuous section of the array in 
 time as well. This can be done using a binary tree data structure with the leaves of the tree storing the 
 numbers and each node in the tree storing the product of the numbers in its sub-tree. A primitive illustration of this (with the leaves on top) would be as follows:
Note:  indicates that the node is keeping the product of 
.
Clearly, each change in the array affects the value stored in  of these nodes, hence any updates to the data structure can be achieved in 
 time by combining the values of the node's children in every affected node, going from the affected leaf to the root. It can also be shown that any interval of the array can be decomposed into at most 
 of these intervals, so the product of values in any interval can be calculated in 
 time as well.
Final Note: The author also developed an extended version of this problem in which you catch  fish, rather than just 
, and the jewels from the two fish are counted together. It is also doable in polynomial time, although it is much more complicated. If you are enthusiastic about solving this version, you should feel free to send your solutions to Velin.Tzanov@deshaw.com.
Comments