P2041【CQOI2011】动态逆序对
问题描述
对于序列A,它的逆序对数定义为满足i < j,且Ai > Aj的数对(i,j)的个数。给1到n的一个排列,按照某种顺序依次删除m个元素,你的任务是在每次删除一个元素之前统计整个序列的逆序对数。
输入格式
输入第一行包含两个整数n和m,即初始元素的个数和删除的元素个数。以下n行每行包含一个1到n之间的正整数,即初始排列。以下m行每行一个正整数,依次为每次删除的元素。
输出格式
输出包含m行,依次为删除每个元素之前,逆序对的个数。
样例输入
5 4
1
5
3
4
2
5
1
4
2
样例输出
5
2
2
1
数据范围
n <=100000
m <=50000
按照逆序对的定义,只需要支持查找前面比他大的和后面比他小的。
树套树的做法就不说了,我用的树状数组套主席树。
显然最优秀的做法是CDQ分治,离线倒序添加,将没删掉的点视为最先添加的,对添加时间分治,对x坐标排序,用树状数组维护y坐标即可。统计答案的时候求一下前缀和。
分治代码:
1 |
|
树套树代码:
1 |
|