Skip to content

Commit 93e92a6

Browse files
committed
BIT and Segment Tree added for reverse pairs problem
1 parent 1ab0cfa commit 93e92a6

File tree

1 file changed

+123
-0
lines changed

1 file changed

+123
-0
lines changed

source-code/Reverse_Pairs.cpp

+123
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,129 @@ class Solution {
5858

5959
};
6060

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+
61184
// TLE (for skewed binary tree)
62185
class Solution {
63186
class BST {

0 commit comments

Comments
 (0)