逆序对的求法(树状数组)

来源:互联网 发布:yy网络直播间 编辑:程序博客网 时间:2024/05/18 01:58
设A[1...n]是一个包含n个不同数的数组,如果在i<j的情况下,有A[i]>A[j],则(i,j)就称为A中的一个逆序对。

求法有两种,一种是归并排序,一种是树状数组。二者的时间复杂度都是O(n*logn),但树状数组更加好写。


思路:开一个树状数组A记录每一个数出现的次数。倒序输入,每输入一个数num就在A中加1,同时求一下从0到num-1的前缀和。


#include <iostream>using namespace std;void AddNum(int * arr, int iArrSize, int iIndex, int iNum){for (int i = iIndex; i <= iArrSize; i += (i & (-i)))arr[i] += iNum;}int GetSum(int * arr, int iIndex){int iAns = 0;for (int i = iIndex; i; i -= (i & (-i)))iAns += arr[i];return iAns;}int main(){int iNumTot, arrSum[1010] = { 0 }, arrNum[1010] = { 0 };cin >> iNumTot;int iAns = 0;for (int i = 1; i <= iNumTot; i++)cin >> arrNum[i];for (int i = iNumTot; i >= 1; i--){AddNum(arrSum, 1000, arrNum[i], 1);iAns += GetSum(arrSum, arrNum[i] - 1);}cout << iAns << endl;return 0;}