首页 > 代码库 > bzoj3295(线段树套平衡树(treap))

bzoj3295(线段树套平衡树(treap))

3295: [Cqoi2011]动态逆序对

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 861  Solved: 287
[Submit][Status]

Description

对于序列A,它的逆序对数定义为满足i<j,且Ai>Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。

Input

输入第一行包含两个整数nm,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。
 

Output

 
输出包含m行,依次为删除每个元素之前,逆序对的个数。

Sample Input

5 4
1
5
3
4
2
5
1
4
2

Sample Output

5
2
2
1

样例解释
(1,5,3,4,2)(1,3,4,2)(3,4,2)(3,2)(3)。

HINT

N<=100000 M<=50000



题意:RT

思路:线段树套平衡树碾压~第一次写,居然1Y了,6420MS,不知道是慢还是快

            动态的删除元素,这个可以用线段树来完成,线段树里的每个节点维护一棵平衡树,当要删除一个元素时将包含该元素的所有线段树的节点都插入到节点所对应的平衡树

            里面,然后预处理出每个元素的前面有多少个元素比它大和后面有多少个元素比它小,每次查询,只需要在包含的线段里查出比现在要删除的元素大的以及小的,这个可

            以在各个节点所维护的平衡树里完成,然后细节看代码吧~~

<script src="https://code.csdn.net/snippets/462775.js" type="text/javascript"></script>

bzoj3295(线段树套平衡树(treap))