问题描述 小张在暑假时间来到工地搬砖挣钱。包工头交给他一项艰巨的任务,将一排砖头按照从低到高的顺序排好。可是小张的力量有限,每次只能交换相邻的两块砖头,请问他最少交换几次能够完成任务?
输入 第一行一个整数 n(1 ≤ n ≤ 300000) ,表示砖头数量。 第二行 n 个整数 a i ( − 1000000000 ≤ a i ≤ 1000000000) ,表示砖头的高度。
输出 一个整数,表示最少交换几次能够完成任务。
样例
输入(1)
5
4 1 3 2 5
输出(1)
4
代码
#include <stdio.h>
#define SIZE 300010
int pos[SIZE], temp[SIZE];
long long ans = 0;
void mergeSort(int left, int right);
void merge(int left, int mid, int right);
int main(void)
{
int n;
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &pos[i]);
}
mergeSort(0, n - 1);
printf("%lld\n", ans);
return 0;
}
void mergeSort(int left, int right)
{
if (left < right)
{
int mid = (left + right) / 2;
mergeSort(left, mid);
mergeSort(mid + 1, right);
merge(left, mid, right);
}
}
void merge(int left, int mid, int right)
{
int i = left, j = mid + 1;
int k = left;
while (i <= mid && j <= right)
{
if (pos[i] > pos[j])
{
temp[k++] = pos[j++];
ans += (long long)((mid + 1) - i);
}
else
{
temp[k++] = pos[i++];
}
}
while (i <= mid)
{
temp[k++] = pos[i++];
}
while (j <= right)
{
temp[k++] = pos[j++];
}
for (i = left; i <= right; i++)
{
pos[i] = temp[i];
}
}