https://leetcode.com/problems/count-subarrays-with-more-ones-than-zeros/
1.首先把 出现0 当成-1,
2.求出前缀和数组s[]
subarray 1比0多,就是前缀和的差是正数,比如i ~ j 这段subarray里1比0多,那么就是s[i] - s[j - 1] > 0
就能够转化为,对于s[i],要找到前面有多少个前缀和是小于s[i]的值,
例如 [0,1,1,0,1]
[-1,1,1,-1,1]
前缀和数组是 [0,-1,0,1,0,1]
[0,0,1,3,1,4] 对应的每个数前面有多少个小于他的数
暴力循环会超时
采用树状数组记录 每个前缀和出现的次数,当查找某一个前缀和s[i] 就找在 头到最s[i] 之间的数有多少个就好了
树状数组 几个操作
int lowbit(x){
return x & -x;
}
void add(int x, int c){
for(int i = x; i < N; i += lowbit(i)) tr[i] += c;
}
void query(int x){
int res = 0;
for(int i = x; i > 0; i-= lowbit(i)) res += tr[i];
return res;
}