给定一个1-N的排列A1, A2, ... AN,如果Ai和Aj满足i < j且Ai > Aj,我们就称(Ai, Aj)是一个逆序对。
求A1, A2 ... AN中所有逆序对的数目。
Input
第一行包含一个整数N。
第二行包含N个两两不同整数A1, A2, ... AN。(1 <= Ai <= N)
对于60%的数据 1 <= N <= 1000
对于100%的数据 1 <= N <= 100000
Output
一个整数代表答案
Sample Input
5
3 2 4 5 1
Sample Output
5
#include <iostream>
#include <set>
#include <cstdio>
#include <map>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <queue>
#include <vector>
#include <malloc.h>
#include <algorithm>
using namespace std;
typedef long long LL;
int arr[100010];
LL sum=0;
void merge_sort(int left,int right){
if(left>=right) return ;
int mid=(left+right)>>1;
merge_sort(left,mid);
merge_sort(mid+1,right);
//Merge(left,right);
int i=left,j=mid+1;
int temp[100010];
int k=left;
while(i<=mid&&j<=right){
if(arr[i]>arr[j]){
sum+=mid-i+1;
temp[k++]=arr[j++];
}else{
temp[k++]=arr[i++];
}
}
while(i<=mid){
temp[k++]=arr[i++];
}
while(j<=right){
temp[k++]=arr[j++];
}
for(int coun=left;coun<=right;coun++){
arr[coun]=temp[coun];
}
return ;
}
int main(){
int num;
//while(cin>>num){
cin>>num;
sum=0;
memset(arr,0,sizeof(arr));
for(int i=1;i<=num;i++){
cin>>arr[i];
}
merge_sort(1,num);
cout<<sum<<endl;
//}
return 0;
}
//注意sum的数据类型