Inversion
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Total Submission(s): 5034 Accepted Submission(s): 1773
Problem Description
bobo has a sequence a1,a2,…,an. He is allowed to swap two adjacent numbers for no more than k times.
Find the minimum number of inversions after his swaps.
Note: The number of inversions is the number of pair (i,j) where 1≤i
#include <cstring>
#include <cmath>
#include <cstdio>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
int n;
int a[maxn],tmp[maxn];
ll ans;
void init(){
scanf("%d",&n);
for (int i=1; i<=n; i++) scanf("%d",&a[i]);
ans = 0;
}
void Merge(int left, int mid, int right){
int i = left, j = mid+1, k = left;
while (i<=mid && j<=right){
if (a[i]>a[j]){
tmp[k++] = a[j++];
ans += mid+1-i;
}
else tmp[k++] = a[i++];
}
while (i<=mid) tmp[k++] = a[i++];
while (j<=right) tmp[k++] = a[j++];
for (int i=left; i<=right; i++ ) a[i] = tmp[i];
}
void merge_sort(int left, int right){
if (left<right){
int mid = (left+right)>>1;
merge_sort(left,mid);
merge_sort(mid+1,right);
Merge(left,mid,right);
}
}
int main(){
int T;
scanf("%d",&T);
while (T--){
init();
merge_sort(1,n);
printf("%lld\n",ans);
}
return 0;
}