#include <stdio.h>
#pragma warning(disable : 4996)
//#define n_max 100001
#define n_max 10
int n; //길의 n
int arr[n_max];
int temp[n_max];
long long int merge(int left, int mid, int right) {
int l, m, t;
long long int result;
result = 0;
l = t = left;
m = mid;
while (l <= mid - 1 && m <= right)
{
if (arr[l] <= arr[m])
{
temp[t++] = arr[l++];
}
else
{
temp[t++] = arr[m++];
result += (mid - l); // 변경 될 때,
}
}
while (l <= mid - 1)
temp[t++] = arr[l++];
while (m <= right)
temp[t++] = arr[m++];
for (l = left; l <= right; l++)
arr[l] = temp[l];
return result;
}
long long int mergeSort(int left, int right)
{
int mid;
long long int result;
result = 0;
mid = (right + left) / 2;
if (left < right)
{
result = mergeSort(left, mid) + mergeSort(mid + 1, right);
result += merge(left, mid + 1, right);
}
return result;
}
int main(void)
{
int test_case;
int T;
int i;
long long int result; //정답
freopen("input.txt", "r", stdin);
setbuf(stdout, NULL);
scanf("%d", &T);
for (test_case = 1; test_case <= T; ++test_case)
{
scanf("%d", &n);
for (i = 0; i < n; i++)
scanf("%d", &arr[i]);
result = mergeSort(0, n - 1);
printf("#%d %lli\n", test_case, result);
}
return 0;
}
댓글