#include <iostream>
#include <cstring>
#include <cstdio>
typedef long long ll;
const int N = 1000005;
ll A[N],B[N];
ll ans,n;
void Merge(ll A[],ll l,ll m,ll r){
ll i = l;
ll j = m+1;
ll cnt = l;
while(i <= m && j <= r){
if(A[i] <= A[j]){
B[cnt++] = A[i++];
}
else {
B[cnt++] = A[j++];
ans += j - cnt;
}
}
while(i <= m){
B[cnt++] = A[i++];
}
while(j <= r){
B[cnt++] = A[j++];
}
for(ll k=l;k<=r;k++){
A[k] = B[k];
}
}
void MergeSort(ll A[],ll l,ll r){
if(l == r){
return ;
}
ll m = (l+r) >> 1;
MergeSort(A,l,m);
MergeSort(A,m+1,r);
Merge(A,l,m,r);
}
int main(){
int t;
scanf("%d",&t);
while(t--){
scanf("%lld",&n);
for(int i=0;i<n;i++){
scanf("%lld",&A[i]);
}
ans = 0;
MergeSort(A,0,n-1);
printf("%lld\n",ans);
// for(ll i=0;i<n;i++){
// printf("%lld ",A[i]);
// }
}
return 0;
}
NYOJ-117 求逆序数(归并排序)
最新推荐文章于 2019-03-22 11:32:52 发布