Skip to content

Commit 33b0c0f

Browse files
authored
Create 2031.Count-Subarrays-With-More-Ones-Than-Zeros.cpp
1 parent 63b0a08 commit 33b0c0f

File tree

1 file changed

+55
-0
lines changed

1 file changed

+55
-0
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
const int MAX_N = 200003;
2+
using LL = long long;
3+
4+
class Solution {
5+
int OFFSET = 100001;
6+
long long bitArr[MAX_N];
7+
long long nums[MAX_N]; // Note: nums is 1-index
8+
long long M = 1e9+7;
9+
10+
// increase nums[i] by delta (1-index)
11+
void updateDelta(int i, long long delta) {
12+
int idx = i;
13+
while (idx <= MAX_N)
14+
{
15+
bitArr[idx]+=delta;
16+
bitArr[idx] %= M;
17+
idx+=idx&(-idx);
18+
}
19+
}
20+
21+
// sum of a range nums[1:j] inclusively, 1-index
22+
long long queryPreSum(int idx){
23+
long long result = 0;
24+
while (idx){
25+
result += bitArr[idx];
26+
result %= M;
27+
idx-=idx&(-idx);
28+
}
29+
return result;
30+
}
31+
32+
// sum of a range nums[i:j] inclusively
33+
long long sumRange(int i, int j) {
34+
return queryPreSum(j)-queryPreSum(i-1);
35+
}
36+
37+
public:
38+
int subarraysWithMoreZerosThanOnes(vector<int>& nums)
39+
{
40+
cout<<nums.size()<<endl;
41+
int diff = 0;
42+
LL ret = 0;
43+
updateDelta(0+OFFSET, 1);
44+
45+
for (int i=0; i<nums.size(); i++)
46+
{
47+
if (nums[i]==1) diff++;
48+
else diff--;
49+
50+
ret = (ret + queryPreSum(diff-1+OFFSET)) % M;
51+
updateDelta(diff+OFFSET, 1);
52+
}
53+
return ret;
54+
}
55+
};

0 commit comments

Comments
 (0)