-
-
Notifications
You must be signed in to change notification settings - Fork 298
/
Copy path493.cpp
105 lines (101 loc) · 3.48 KB
/
493.cpp
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
__________________________________________________________________________________________________
sample 84 ms submission
static int io_optimize = []() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
return 0; } ();
typedef int ParamType;
const int _max_len = 5e4;
static ParamType _swap_arr[_max_len];
class Solution {
int mergesort_binary(ParamType* A, int mid, int right) {
int sum = 0;
ParamType *end = A + mid, *begin = A;
for (int j = mid; j <= right; ++j) {
ParamType* p = std::upper_bound(begin, end,
2 * static_cast<long long>(A[j]));
if (p == end) break;
sum += end - p;
begin = p;
}
int i = 0, j = mid, k = 0;
ParamType* T = _swap_arr;
do {
if (A[i] <= A[j]) {
T[k++] = A[i++];
if (i >= mid) {
while (j <= right) T[k++] = A[j++];
break;
}
} else {
T[k++] = A[j++];
if (j > right) {
while (i < mid) T[k++] = A[i++];
break;
}
}
} while (true);
memcpy(A, T, sizeof(T[0]) * k);
return sum;
}
int mergesort(ParamType* A, int mid, int right) {
int sum = 0;
ParamType *end = A + mid, *begin = A;
int i = 0, j = mid, k = 0;
ParamType* T = _swap_arr;
for (; j <= right; ++j) {
register ParamType tmp = A[j];
while (i < mid && A[i] <= tmp) T[k++] = A[i++];
T[k++] = tmp;
long long tmp_d = static_cast<long long>(tmp) * 2;
while (*begin <= tmp_d) {
if (++begin >= end) {
for (++j; j <= right; ++j) {
register ParamType tmp = A[j];
while (i < mid && A[i] <= tmp) T[k++] = A[i++];
T[k++] = tmp;
}
goto _sort;
}
}
sum += end - begin;
}
_sort:
while (i < mid) T[k++] = A[i++];
memcpy(A, T, sizeof(T[0]) * k);
return sum;
}
int merge(ParamType* begin, int right) {
// if (left >= right) return;
int sum = 0;
int mid = right / 2;
if (0 < mid) sum += merge(begin, mid);
if (mid + 1 < right) sum += merge(begin + mid + 1, right - mid - 1);
if (0 < right) sum += mergesort(begin, mid + 1, right);
return sum;
}
public:
int reversePairs(std::vector<ParamType>& nums) {
return merge(nums.data(), nums.size() - 1);
}
};
__________________________________________________________________________________________________
sample 15644 kb submission
class Solution {
public:
int reversePairs(vector<int>& nums) {
return mergeSort(nums, 0, nums.size() - 1);
}
int mergeSort(vector<int>& nums, int left, int right) {
if (left >= right) return 0;
int mid = left + (right - left) / 2;
int res = mergeSort(nums, left, mid) + mergeSort(nums, mid + 1, right);
for (int i = left, j = mid + 1; i <= mid; ++i) {
while (j <= right && nums[i] / 2.0 > nums[j]) ++j;
res += j - (mid + 1);
}
sort(nums.begin() + left, nums.begin() + right + 1);
return res;
}
};
__________________________________________________________________________________________________