![]()
```C
typedef struct Node {
int num; // 值
int index; // 原数组索引
int size; // 逆序对数量
} Node;
class Solution {
public:
void mergeSort(vector<Node> &arr, int left, int right) {
if (left >= right) return;
int mid = (left + right) >> 1;
mergeSort(arr, left, mid);
mergeSort(arr, mid + 1, right);
vector<Node> temp;
int i = left, j = mid + 1;
while (i <= mid && j <= right) {
if (arr[i].num <= arr[j].num) {
temp.push_back(arr[j++]);
} else {
// 每当左半区偏大时,与右半区剩余偏小元素构成逆序
arr[i].size += right - j + 1;
temp.push_back(arr[i++]);
}
}
while (i <= mid) {
temp.push_back(arr[i++]);
}
while (j <= right) {
temp.push_back(arr[j++]);
}
for (int i = left, j = 0; i <= right; i++, j++) {
arr[i] = temp[j];
}
}
vector<int> countSmaller(vector<int> &nums) {
vector<Node> arr;
for (int i = 0; i < nums.size(); i++) {
arr.push_back(Node{nums[i], i, 0});
}
mergeSort(arr, 0, arr.size() - 1);
// 按照索引生成结果
vector<int> result(nums.size());
for (const auto &node : arr) {
result[node.index] = node.size;
}
return result;
}
};