#include<iostream>
using namespace std;
const int maxn=10010;
int a[maxn];
void merge(int a[],int l1,int r1,int l2,int r2)
{
int i=l1,j=l2;
int t[maxn],index=0;
while(i<=r1&&j<=r2)
{
if(a[i]<a[j])
{
t[index++]=a[i++];
}
else{
t[index++]=a[j++];
}
}
while(i<=r1)
{
t[index++]=a[i++];
}
while(j<=r2)
{
t[index++]=a[j++];
}
for(int i=0;i<index;i++)
{
a[l1+i]=t[i];
}
}
void mergeSort(int a[],int left,int right)
{
if(left<right)
{
int mid=(left+right)/2;
mergeSort(a,left,mid);
mergeSort(a,mid+1,right);
merge(a,left,mid,mid+1,right);
}
}
int main()
{
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
}
mergeSort(a,0,n-1);
for(int i=0;i<n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}
788. 逆序对的数量
给定一个长度为n的整数数列,请你计算数列中的逆序对的数量。
逆序对的定义如下:对于数列的第 i 个和第 j 个元素,如果满足 i < j 且 a[i] > a[j],则其为一个逆序对;否则不是。
输入格式
第一行包含整数n,表示数列的长度。
第二行包含 n 个整数,表示整个数列。
输出格式
输出一个整数,表示逆序对的个数。
数据范围
1≤n≤1000001≤n≤100000
输入样例:
6
2 3 4 5 6 1
输出样例:
5