c++
class Solution {
public:
struct Data {
Data(int val, int ind) : val(val), ind(ind), cnt(0) {}
bool operator>(Data a) {
return val > a.val;
}
int val, ind, cnt;
};
void mergeSort(vector<Data> &arr, vector<Data> &tmp, int l, int r) {
if (l >= r) return ;
int mid = (l + r) >> 1;
mergeSort(arr, tmp, l, mid);
mergeSort(arr, tmp, mid + 1, r);
int k = l, p1 = l, p2 = mid + 1;
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && arr[p1] > arr[p2])) {
arr[p1].cnt += r - p2 + 1;
tmp[k++] = arr[p1++];
} else {
tmp[k++] = arr[p2++];
}
}
for (int i = l; i <= r; i++) arr[i] = tmp[i];
return ;
}
vector<int> countSmaller(vector<int>& nums) {
vector<Data> arr;
vector<Data> tmp;
for (int i = 0; i < nums.size(); i++) arr.push_back(Data{nums[i], i}), tmp.push_back(Data{0, 0});
mergeSort(arr, tmp, 0, arr.size() - 1);
vector<int> ans(arr.size(), 0);
for (auto x : arr) ans[x.ind] = x.cnt;
return ans;
}
};
js
function mergeSort(arr, tmp, l, r) {
if (l >= r) return ;
var mid = Math.floor((l + r) / 2);
mergeSort(arr, tmp, l, mid);
mergeSort(arr, tmp, mid + 1, r);
var k = l, p1 = l, p2 = mid + 1;
while (p1 <= mid || p2 <= r) {
if (p2 > r || (p1 <= mid && arr[p1].val > arr[p2].val)) {
arr[p1].cnt += r - p2 + 1;
tmp[k++] = arr[p1++]
} else tmp[k++] = arr[p2++];
}
for (var i = l; i <= r; i++) arr[i] = tmp[i];
return ;
}
var countSmaller = function(nums) {
var arr = [], tmp = [], ans = [];
for (var i = 0; i < nums.length; i++) arr.push({val : nums[i], ind : i, cnt : 0});
mergeSort(arr, tmp, 0, arr.length - 1);
for (var x of arr) ans[x.ind] = x.cnt;
return ans;
};