题目描述:给定n(10^5)个数[1,n],删去连续的m个数,使剩下的数逆序对最少。
提前声明:此题方向有些偏差,导致没能A掉,借鉴某神的博客,有一些收获。
知识:关于树状数组求解逆序对,其实就是加入a[i]元素,则此数对于ans的贡献就是
sum(a[i]-1),所以用树状数组求逆序对的复杂度是O(n*log(MAX)),其中max为最大元素。
思路:这道题思路大致有两个方向,第一个方向,在这n-m个数上去求解;第二个方向:在删去的m个数上求解。但是感觉第一个方向不好下手,遂在第二个方向上努力,去要求得m个数中贡献的逆序对数量,可以先正着做一遍树状数组,存到f数组,再倒着做一遍,对于[l,r]贡献就是∑f[i]+g[i],但是算重了一部分,就是[l,r]这一部分的逆序对,所以就用到上篇博客的做法了。然后再来说一下第一个方向,直接看变化的n-m个数,每次在中间位置换掉一个数,而对于一个数对于区间逆序对的贡献就简单了,不必考虑算重的情况。还是维护两个树状数组,对于区间[1,k-1],[k+1,n]把a[k]改变成另外一个值,先删除[1,k-1]中比a[k]大的元素个数以及[k+1,n]中比它小的个数,再加上新的数对答案的贡献即可。