@@ -58,6 +58,129 @@ class Solution {
58
58
59
59
};
60
60
61
+ // Segment Tree (AC)
62
+ class Solution {
63
+ class SegmentTree {
64
+ int n;
65
+ vector<int > segmentNode;
66
+
67
+ void insert (int node, int left, int right, const int indx) {
68
+ if (indx < left or indx > right) {
69
+ return ;
70
+ }
71
+ if (left == right and indx == left) {
72
+ segmentNode[node]++;
73
+ return ;
74
+ }
75
+ int leftNode = node << 1 ;
76
+ int rightNode = leftNode | 1 ;
77
+ int mid = left + (right - left) / 2 ;
78
+
79
+ insert (leftNode, left, mid, indx);
80
+ insert (rightNode, mid + 1 , right, indx);
81
+
82
+ segmentNode[node] = segmentNode[leftNode] + segmentNode[rightNode];
83
+ }
84
+
85
+ int query (int node, int left, int right, const int L, const int R) {
86
+ if (left > R or right < L) {
87
+ return 0 ;
88
+ }
89
+ if (left >= L and right <= R) {
90
+ return segmentNode[node];
91
+ }
92
+
93
+ int leftNode = node << 1 ;
94
+ int rightNode = leftNode | 1 ;
95
+ int mid = left + (right - left) / 2 ;
96
+
97
+ return query (leftNode, left, mid, L, R) + query (rightNode, mid + 1 , right, L, R);
98
+ }
99
+
100
+ public:
101
+ void init (int n) {
102
+ this ->n = n;
103
+ int N = 2 * pow (2.0 , floor (log ((double ) n) / log (2.0 )) + 1 );
104
+ segmentNode.resize (N, 0 );
105
+ }
106
+
107
+ int query (const int L, const int R) {
108
+ return query (1 , 0 , n - 1 , L, R);
109
+ }
110
+
111
+ void insert (int value) {
112
+ insert (1 , 0 , n - 1 , value);
113
+ }
114
+
115
+ };
116
+
117
+ int lowerBound (vector<int >& nums, long long key) {
118
+ int left = 0 , right = nums.size ();
119
+ while (left < right) {
120
+ int mid = left + (right - left) / 2 ;
121
+ if (nums[mid] >= key) {
122
+ right = mid;
123
+ } else {
124
+ left = mid + 1 ;
125
+ }
126
+ }
127
+ return left;
128
+ }
129
+
130
+ public:
131
+ int reversePairs (vector<int >& nums) {
132
+ int result = 0 ;
133
+ if (nums.empty ()) {
134
+ return result;
135
+ }
136
+ int n = (int )nums.size ();
137
+ vector<int > numsCopy (nums);
138
+ sort (numsCopy.begin (), numsCopy.end ());
139
+ SegmentTree segmentTree;
140
+ segmentTree.init (n);
141
+ for (int i = 0 ; i < n; i++) {
142
+ result += segmentTree.query (lowerBound (numsCopy, 2LL * nums[i] + 1 ), nums.size () - 1 );
143
+ segmentTree.insert (lowerBound (numsCopy, nums[i]));
144
+ }
145
+ return result;
146
+ }
147
+ };
148
+
149
+ // BIT (AC)
150
+ class Solution {
151
+ void update (vector<int >& BIT, int index) {
152
+ while (index > 0 ) {
153
+ BIT[index ]++;
154
+ index -= index & (-index );
155
+ }
156
+ }
157
+
158
+ int query (vector<int >& BIT, int index) {
159
+ int sum = 0 ;
160
+ while (index < BIT.size ()) {
161
+ sum += BIT[index ];
162
+ index += index & (-index );
163
+ }
164
+ return sum;
165
+ }
166
+
167
+ public:
168
+ int reversePairs (vector<int >& nums) {
169
+ int n = nums.size ();
170
+ vector<int > numsCopy (nums);
171
+
172
+ sort (numsCopy.begin (), numsCopy.end ());
173
+
174
+ vector<int > BITS (n + 1 , 0 );
175
+ int count = 0 ;
176
+ for (int i = 0 ; i < n; i++) {
177
+ count += query (BITS, lower_bound (numsCopy.begin (), numsCopy.end (), 2LL * nums[i] + 1 ) - numsCopy.begin () + 1 );
178
+ update (BITS, lower_bound (numsCopy.begin (), numsCopy.end (), nums[i]) - numsCopy.begin () + 1 );
179
+ }
180
+ return count;
181
+ }
182
+ };
183
+
61
184
// TLE (for skewed binary tree)
62
185
class Solution {
63
186
class BST {
0 commit comments