493 Reverse Pairs

題目:
https://leetcode.com/problems/reverse-pairs/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class Solution {
public:
int arr[50005];
int help[50005];

int reversePairs(vector<int>& nums) {
for(int i=0; i<nums.size(); ++i) arr[i] = nums[i];
return count(0, nums.size()-1);
}

int count(int l, int r){
if(l == r) return 0;
int m = (l+r)/2;
return count(l, m) + count(m+1, r) + merge(l, m, r);
}

int merge(int l, int m, int r){
// count
int ans = 0;
for(int i = l, j=m+1; i<=m; ++i){
while(j <= r && (long)arr[i] > (long)arr[j]*2){
j++;
}
ans += j - m - 1; // j-(m+1)
}
// merge
int i = l;
int a = l;
int b = m+1;
while(a <= m && b <= r){
help[i++] = (arr[a] <= arr[b]) ? arr[a++] : arr[b++];
}
while(a <= m){
help[i++] = arr[a++];
}
while(b <= r){
help[i++] = arr[b++];
}
for(int i=l; i <= r; ++i){
arr[i] = help[i];
}

return ans;
}

};