Editorial for COCI '14 Contest 3 #6 Kamioni
Submitting an official solution before solving the problem yourself is a bannable offence.
Let us imagine a simplified version of the task where we only have two trucks and one query. An event is defined as a pair which denotes that the truck with index
is turning around at time
(in other words,
minutes after departure).
After calculating the events and sorting by time, we process one event at a time and keep track of the turnaround time and movement direction for each truck. This information is sufficient to calculate for each moment which truck is located in the city with a smaller index. The encounter is detected when for times
and
(consecutive events times) the following holds:
and
or
and
,
- the city in which the first truck is located at moment
,
- the city in which the second truck is located at moment
.
This claim follows from the fact that two lines can have at most one intersection or completely overlap (but they won't because of the remark from the task).
It was possible to get of points if every query was individually solved in the aforementioned way. This is done by looking at events for the two trucks we wanted to know the number of encounters for in the current query.
When we solve the task for of points, it becomes clear that, in order to fully solve the task, we will need to find a way to solve multiple queries at once. Let us observe the following algorithm:
- assign the query to just one truck from the pair
- calculate the events of all trucks and sort the events by time
- process events in order and while doing so keep track for every truck: the moment when it last turned around, the position it last turned around and its movement direction
- while processing event
of truck with index
, for each query assigned to that truck we ask ourselves whether the other truck from the pair is located to the left or to the right of it in time
; let us notice that the condition about encounters from the explanation of the
solution is still valid even though we are observing the relative position of trucks from the query while processing the event for only one truck from the pair (caution is needed only when processing the event after the aliens abduct a truck)
Let be the sum of all
. If we always assign the query to the truck with the smaller number of cities in its route, we reach a complexity of
. It is easy to prove the complexity if we split the queries to small and large (a query is large if both trucks from the pair have more than
cities in their route, otherwise it is small). We can have
small queries and for every small query, we need to determine the relative position of trucks at most
times. We can have at most
large queries (the ones with more than
cities in their route) and for each of them, the second trucks from the query can determine the relative position at most
times. Therefore, the complexity of processing small queries is
and large
which gives us the total complexity of
.
The task has an alternative solution of the same complexity that splits the trucks to those who have more than cities on their route and calculates their number of encounters with each of the other trucks and to trucks that have less than
cities on their route and calculates only the queries that haven't been calculated while processing the large queries.
Comments