树状数组 - wenzhoullq/leetcode GitHub Wiki
适用于单点修改,区间求和的数据结构,并且它支持二分找下标和动态加入的数据结构。
求和从右到左,修改/增加从左到右。C[]数组为原数组的len+1,这样就可以统一模板了
class BIT{
int[] nums,C;
int len ;
public int lowbit(int x){
return x&(-x);
}
public void add(int index,int val){
int i = index+1;
while(i<len){
C[i]+= val;
i+=lowbit(i);
}
}
public void update(int index,int val){
int i = index+1, num = val - nums[index];
nums[index] = val;
while(i<len){
C[i]+= num;
i+=lowbit(i);
}
}
public int query(int index){
int i = index+1,ans = 0;
while(i>0){
ans+=C[i];
i-=lowbit(i);
}
return ans;
}
public BIT(int n) {
len = n+1;
C = new int[len];
}
public int sum(int left, int right) {
return query(right+1) - query(left);
}
}
class BIT{}
TreeSet<Integer> tm = new TreeSet<>();
for(int num:nums) {//加入所有的可能的数字
ts.add(num);
ts.add();
}
HashMap<Integer,Integer> m = new HashMap<>();
int rank = 1;
for(int key:ts) m.put(,rank++)
BIT bit = new BIT(rank+10);
for(int i = 0 ; i < len ; i++){
int num = m.get();
int right = , left = ;
}
327. 区间和的个数 求前缀,记得加前缀=0的部分和query时候index+1
775. 全局倒置与局部倒置有快的做法