此题算是一个练习各种树的题目。。此题是求区间k大值,可以用各种方法做。线段树,树状数组,avl,treap,sbt,splay,划分树做。。。。
展示不会划分和avl还有sbt 用treap写的
此题本来按照书上的写法写的。。但是觉得书上那种写法搞不好会有内存溢出的情况。。。其实就是new的多了。但是delete不掉。如果是一个输入文件包含多组数据的话,不能清空以访问的内存,那么就有可能re了。那么我这用的是静态的写法。我开了一个内存池pool来存。那么new的方法就是自己写一个,每回赋空间给new节点就好了。
然后此题做法呢:我后来看discuss的时候看到有完全覆盖区间的问题,由于题目说了无完全覆盖,但是我觉得完全覆盖也是没问题的。
我是离线用treap维护
那么先将所有的问题存起来,然后按R的位置降序排序,那么我每回从第i个问题L到R放入树中,当下一次的时候我删除没有统计到的即我只保留当前的L,R区间。然后在find第k小值。那么假设要删除的个数是num,删除的复杂度是NUM*logn一共M次询问第一次可以不删除所以是(M-1)*NUM *log n 加入的复杂度差不多
在n<100001 and m<50001.是可以接受的。