【题目描述】
给定一个序列a1,a2,…,an,如果存在i<j并且ai>aj,那么我们称之为逆序对,求逆序对的数目。
【输入】
第一行为n,表示序列长度,接下来的n行,第i+1行表示序列中的第i个数。
【输出】
所有逆序对总数。
【输入样例】
4
3
2
3
2
【输出样例】
3
【提示】
N≤105,Ai≤105
#include <iostream>
using namespace std;
int a[100005],b[100005];
long long sum=0;
void merge(int l, int r){
int p1=l,mid=(l+r)/2,p2=mid+1,p=l;
while(p1<=mid && p2<=r){
if(a[p1]<=a[p2]){
b[p++]=a[p1++];
}
else{
sum+=mid-p1+1;
b[p++]=a[p2++];
}
}
while(p1<=mid){
b[p++]=a[p1++];
}
while(p2<=r){
b[p++]=a[p2++];
}
for(int i=l;i<=r;i++){
a[i]=b[i];
}
}
void merge_sort(int l, int r){
if(l==r){
return;
}
int mid=(l+r)/2;
merge_sort(l,mid);
merge_sort(mid+1,r);
merge(l,r);
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
merge_sort(1,n);
cout<<sum;
return 0;
}
。