AcWing 788. 逆序对的数量
原题链接
简单
作者:
Kiyomi
,
2024-09-14 17:29:05
,
所有人可见
,
阅读 6
#include <iostream>
using namespace std;
const int N=1e5+10;
int p[N];
int tmp[N];
long long merge_sort(int p[],int l,int r){
if(l>=r) return 0;
int x = (l+r)>>1; // [l,r]->[l,x][x+1,r]
// 第一类 都在左区间
// 第二类 都在右区间
long long res = merge_sort(p,l,x)+merge_sort(p,x+1,r);
int i = l,j = x+1,k=0;
while(i<=x&&j<=r){
if(p[i]<=p[j]) tmp[k++] = p[i++];
else {
// 第三类 一个在左区间一个在右区间
res+=x-i+1;
tmp[k++] = p[j++];
}
}
while(i<=x) tmp[k++] = p[i++];
while(j<=r) tmp[k++] = p[j++];
for (i = l, j = 0; i <= r; i ++, j ++ ) {
p[i] = tmp[j];
}
return res;
}
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&p[i]);
}
merge_sort(p,0,n-1);
for(int i=0;i<n;i++){
printf("%d ",p[i]);
}
}