File tree Expand file tree Collapse file tree 1 file changed +55
-0
lines changed
Segment_Tree/2031.Count-Subarrays-With-More-Ones-Than-Zeros Expand file tree Collapse file tree 1 file changed +55
-0
lines changed Original file line number Diff line number Diff line change 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+ };
You can’t perform that action at this time.
0 commit comments