输出逆序数对和距离
#include <stdio.h>
#define max 1000001
long long a[max], b[max];
long long count, dis;
void Merge(long long a[], int start, int mid, int end) //归并排序的合并部分
{
int i = start, j = mid + 1, k = start;
while (i <= mid && j <= end)
{
if (a[i] <= a[j])
{
b[k++] = a[i++];
}
else
{
for (int cc = i; i <= mid; i++)
{
dis += a[i] - a[j];
}
count += j - k;//统计逆序数对
b[k++] = a[j++];
}
}
while (i <= mid)
{
b[k++] = a[i++];
}
while (j <= end)
{
b[k++] = a[j++];
}
for (int i = start; i <= end; i++)
{
a[i] = b[i];
}
}
void MergeSort(long long a[], int start, int end) //归并排序
{
if (start < end)
{
int mid = (start + end) / 2;
MergeSort(a, start, mid); // 将前半部分排序
MergeSort(a, mid + 1, end); // 将后半部分排序
Merge(a, start, mid, end); // 合并前后两个部分
}
}
int main(int argc, char const *argv[])
{
int n, m;
scanf_s("%d", &n);
while (n--)
{
scanf_s("%d", &m);
count = 0;
for (int i = 0; i < m; i++)
{
scanf_s("%d", a + i);
}
MergeSort(a, 0, m - 1);
printf("%lld\n", count);
printf("%lld\n", dis);
}
return 0;
}
//1
//5
//1 3 4 2 5