AcWing 788. 逆序对的数量
原题链接
简单
作者:
minux
,
2020-04-21 15:18:04
,
所有人可见
,
阅读 425
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=1e5+5;
int a[N];
int b[N]; // 辅助空间
int n;
// 数据归并
void merge(int l, int mid, int r, LL &res){
int index=0;
int i=l;
int j=mid+1;
while(i<=mid && j<=r){
// 不构成逆序对
if(a[i]<=a[j]) b[index++]=a[i++];
// a[i]>a[j], 构成逆序对且a[i~mid]均与a[j]构成逆序对, 因为a[l..mid]为升序
else{
b[index++]=a[j++];
res+=mid-i+1;
}
}
while(i<=mid) b[index++]=a[i++];
while(j<=r) b[index++]=a[j++];
// 复制回原始数组
for(int i=l, j=0; i<=r; ++i, ++j) a[i]=b[j];
}
// 计算区间[l..r]中所有逆序对的数量
LL mergeSort(int l, int r){
if(l<r){
int mid = l+(r-l)/2;
LL res = mergeSort(l, mid)+mergeSort(mid+1, r); // res中保存了数组中的逆序对的数量
merge(l, mid, r, res);
return res;
}
return 0;
}
int main(){
memset(a, 0x00, sizeof a);
memset(b, 0x00, sizeof b);
cin>>n;
for(int i=0; i<n; ++i) cin>>a[i];
// 使用归并排序的方法计算逆序对
cout<<mergeSort(0, n-1);
return 0;
}