Editorial for Facebook Hacker Cup '15 Round 3 P4 - Fox Rocks
Submitting an official solution before solving the problem yourself is a bannable offence.
Let's consider the given directed graph of clearings and trails to be divided into  rows, with nodes 
 in row 
, nodes 
 in row 
, and so on. The constraint that an edge from node 
 to node 
 may only exist if 
 can then be restated as follows: an edge from node 
 to node 
 may only exist if 
 and 
 are in the same row, or if 
 is in the row just after 
's row.
When taking a stroll starting from a node in row , note that Mr. Fox will walk amongst nodes in row 
, walk to a node in row 
, walk amongst nodes in row 
, walk to a node in row 
, and so on until he reaches a closed set of nodes in some row which have no outgoing edges to the following row, which he'll walk amongst forever (or until he reaches a node with no outgoing edges, at which point the stroll will end).
For each row, we'd like to calculate a  table of values 
, where 
 is the probability that, given that Mr. Fox is currently in the 
 node in row 
, he will eventually reach the 
 node in row 
 without having reached any other nodes in row 
 previously. Note that 
 may not be equal to 
, if there's a chance that Mr. Fox will never reach row 
 from the 
 node in row 
.
This table can be calculated by modeling the  nodes in rows 
 and 
 (which we can re-number as nodes 
 and 
 respectively) as a Markov chain, with nodes 
 (and any nodes with no outgoing edges) being absorbing states. In particular, we can construct an 
 one-step transition matrix 
, where 
 if node 
 is an absorbing state, 
 if node 
 is an absorbing state and 
, and 
 is the weighed probability of Mr. Fox walking to node 
 while at node 
 (based on the relative rock counts on outgoing edges from node 
) if 
 is not an absorbing state. The long-run transition matrix 
 can then be computed by using fast matrix exponentiation to take 
 to a high enough power (for example, 
). 
 then consists of the values 
 for 
 and 
. This computation takes 
 time per table. 
 can be computed more efficiently (with 
 time) with Gaussian elimination and some additional operations, but this is not required.
The above  table calculations will need to be done for each row initially (once the starting edges have been inputted), and then each time an edge from some node 
 is added or removed (due to an event of type 1 or 2), the 
 table for node 
's row will have to be recomputed. Therefore, the total time spent on them will be 
, which is expensive but acceptable.
Now, to handle events of type 3, let's say that Mr. Fox starts at the  node in row 
, and we want the probability that he'll eventually visit the 
 node in row 
. If 
, then the answer is trivially 
. Otherwise, the first step is to determine a list of 
 values 
 similar to the 
 table, where 
 is the probability that Mr. Fox will eventually reach the 
 node in row 
 without having reached any other nodes in row 
 previously. In fact, if we consider the product of matrices 
 (or the identity matrix if 
), then 
 is just the 
 row of this resulting matrix.
We can't afford to loop over  rows to compute 
 for each type 3 operation, but the standard concept of using a segment tree to perform range queries will cut that factor down to 
. In this case, each node in the segment tree will store a 
 matrix of probabilities – the leaf nodes of the tree will contain the computed 
 tables, and each interior node will store the product of its left child's matrix with its right child's matrix. Building the tree initially takes 
 time, updating it when a 
 table changes takes 
 time, and querying it to compute 
 also takes 
 time. Therefore, the total time from these calculations is 
.
Finally, given , we still need to consider Mr. Fox walking amongst the nodes in row 
 to determine the probability that he'll ever visit its 
 node. Just like the 
 table calculation, this may be modeled as a Markov chain, with an 
 one-step transition matrix 
 calculated exactly as before but with node 
 also being made into an absorbing state (by ignoring all of its outgoing edges and giving it a self loop). The long-run transition matrix 
 may also be calculated as before, in 
 time, and then the final answer will be 
, considering each of the 
 possible points of entry into row 
.
Comments