参考http://blog.csdn.net/u013480600/article/details/24379341
POJ 3481 Double Queue(Treap)
http://poj.org/problem?id=3481
题意:
每个顾客有个编号和优先级,银行每次可以添加顾客的要求进队列,且保证队列中当前任意顾客的编号和优先级都不同.银行可以执行先服务最大优先级的顾客或者先服务最小优先级的顾客操作.对于每个服务,输出顾客的编号.
分析:
直接构建Treap,插入节点的v值(顾客优先级)和节点的r值(随机函数rand获得)以及节点信息info(顾客编号),然后对于每个操作,先find找到最大v值的节点信息info,然后在delete即可.
———-
POJ 2985 The k-th LargestGroup(Treap+并查集)
http://poj.org/problem?id=2985
题意:
有N只猫,开始每只猫都是一个小组,下面要执行M个操作,操作0 i j 是把i猫和j猫所属的小组合并,操作1 k 是问你当前第k大的小组大小是多少. 且k<=当前的最大组数.
分析:
用并查集维护每只猫所属的集合,且维护集合中的节点数.
然后假设集合S1和集合S2合并,就在Treap中删除V=|S1|的节点并删除V=|S2|的节点.并插入V=|S1|+|S2|的节点.(注意如果|S1|==1,不用删除,因为Treap只保存了合并之后的组大小)