题目的大意是一堆数,选择其中的两个,如果他们是不同群体的话,就选出各自最大的一个,然后PK,减半,并合并在一起。
然后操作一个可并堆来完成,左偏树。黄源河的论文里有详细介绍。
在实现的时候用并查集来维护块。再用一个数组记录该块(也就是一个左偏树)的根。
每次把堆顶元素减半后,堆调下去。再合并两个堆。更新当前集合,并更新当前左偏树的根。
左偏树中的外节点性质很好,因为它都能找到一个儿子是NULL的,然后把merge的任务都交给这边。左偏树的右侧深度是log级别的,merge在这边操作是log级别的。
但这个实现中,关于堆掉的时候,好像最糟糕情况下是O(n)级别的。
感谢:
http://hi.baidu.com/boyzkk1/blog/item/baf7c18a952c57759f2fb498.html