题目解析
对于每一个选手,我们需要找到能力值比他小的选手的数量,并且要排除死对头的情况。
我们可以先把所有选手的能力值,从小到大排序。
如 原序列为:10 4 10 15,排序后 4 10 10 15。
那么如果我们想找到所有能力值低于10的选手数量,那么只需要找到大于等于10在序列中出现的第一个位置。这里大于等于10能力值的位置为222,则有 2−12 - 12−1 个人的能力值小于10,那这里就可以用二分去做了。
那么如处理,死对头呢?因为现在的答案是包含有死对头的情况的。
对于每个选手,我们只需要记录,所有能力值比这个选手小的,并且还是死对头的数量,这个可以在建立死对头关系的时候就处理。
AC代码
复杂度
对于每个选手都要进行一次二分查找,则复杂度为 O(n⋅log2n)O(n \cdot log_{2} n)O(n⋅log2 n)。