题目描述
输入
第一行,一个数n,表示序列中有n个数。
第二行n个数,表示给定的序列。 序列中每个数字不超过1018。
输出
给定序列中逆序对的数目。
样例输入
6
5 4 2 6 3 1
样例输出
11
AC100%题解:
#include<bits/stdc++.h>
using namespace std;
#define N 1000005
int a[N] ,b[N];
long long cnt;
void merge_sort(int l , int r)
{
if(r-l > 0)
{
int mid = (l+r) / 2 ;
merge_sort(l , mid);
merge_sort(mid+1 , r);
int i = l;
int p = l , q = mid+1;
while(p<=mid || q<=r)
{
if(q>r || (p<=mid && a[p]<=a[q]))
b[i++] = a[p++];
else
{
b[i++] = a[q++];
cnt += mid -p + 1;
}
}
for(i = l ; i <= r; i++)
a[i] = b[i];
}
}
int main()
{
int n;
cin >> n;
for(int i = 1 ; i <= n; i ++)
cin >> a[i];
cnt = 0;
merge_sort(1 , n);
cout << cnt <<endl;
return 0;
}