AcWing 788. 逆序对的数量
原题链接
简单
作者:
牛奶小柒Luke
,
2021-03-03 00:34:16
,
所有人可见
,
阅读 272
分治递归思想
不断分割归并
#include <iostream>
using namespace std;
typedef long long LL;
const int N = 1e5 + 10;
int n;
int q[N],tmp[N];
LL merge_sort(int q[],int l,int r){
if(l >= r) return 0;
int mid = l + r >> 1;
LL res = merge_sort(q,l,mid) + merge_sort(q,mid + 1,r);
int k = 0,i = l,j = mid + 1;
while(i <= mid && j <= r){
if(q[i] <= q[j]) tmp[k++] = q[i++];
else{
res += mid - i + 1;
tmp[k++] = q[j++];
}
}
while(i <= mid) tmp[k++] = q[i++];
while(j <= r) tmp[k++] = q[j++];
for(i = l,j = 0;i <= r;++i,++j) q[i] = tmp[j];
return res;
}
int main(){
cin >> n;
for(int i = 0;i < n;++i){
cin >> q[i];
}
cout << merge_sort(q,0,n - 1) << endl;
return 0;
}