Editorial for COCI '20 Contest 4 #4 Janjetina
Submitting an official solution before solving the problem yourself is a bannable offence.
First subtask can be solved by checking for each pair  if the condition holds.
In the second subtask, the tree is a chain. We will describe a solution using divide-and-conquer method. Let  be the number of valid pairs such that 
, and let 
. If we calculate the number of valid pairs 
 such that 
, i.e. the pairs whose path goes through the middle edge 
, we can calculate 
 as the sum of that number, 
, and 
.
Let  be the distance between nodes 
 and 
, and 
 be the maximum weight on the path from 
 to 
 (we can take 
 to be 
). Pair 
 is valid if 
. If we assume that 
, the condition is 
.
We can sort nodes  ascending by 
, and go through them in that order. We will use a Fenwick tree, where we will store the counts of 
 for processed nodes. Let 
 be the current node. We will first query in our Fenwick tree the sum of the prefix 
, and then add 
 to the position 
.
By doing this, we have counted all valid pairs, but also all pairs that are in either the left or the right half that fulfill the condition, which we don't want. So, we will repeat the procedure with nodes , and with nodes 
, and subtract from the result.
The solution for all points is very similar. Now  will be the centroid of the current component. Functions 
 and 
 are defined in the same way. Instead of two halves, we now have some number of subtrees. We first calculate the result with all nodes, and then subtract results for each subtree. Finally, we recursively call 
 for all subtrees.
The complexity is .
Comments