这题比较简单,但是有一个点要想清楚,首先贴代码
#include <iostream>
using namespace std;
const int N = 100010;
typedef long long LL;
int a[N];
LL reverse(int a[], int l, int r){
if (l >= r) return 0;
int mid = l + r >> 1;
LL ans = 0;
int b[N];
ans += reverse (a, l, mid);
ans += reverse (a, mid + 1, r);
int i = l, j = mid + 1, k = 0;
while (i <= mid && j <= r){
if (a[i] <= a[j]) b[k ++] = a[i ++];
else {
b[k ++] = a[j ++];
ans += mid - i + 1;
}
}
while (i <= mid) b[k ++] = a[i ++];
while (j <= r) b[k ++] = a[j ++];
for (int i = 0, j = l; i < k; i ++, j ++) a[j] = b[i];
return ans;
}
int main()
{
int n;
cin >> n;
for (int i = 0; i < n; i ++) cin >> a[i];
LL t = reverse (a, 0, n - 1);
cout << t << endl;
return 0;
}
其中用很多行空格分离出来的就是要特别注意的,这种情况有人肯定问为什么ans不能直接加j - mid - 1 + 1 = j - mid,其实是因为此时是前面的有序数组中的这一项a大于后面的有序数组的数b,那么下一步肯定是b被更新,那么如果利用前面数组的这一项大于b的前面的每一项肯定会重复,因此利用的是a的后面每一个比当前的a要大来计算ans