注意树状数组的功能 :
单点修改,区间查询(维护的是本身这个数组)
区间修改,单点查询(维护的是原数组的前缀和)
struct BIT{
int tr[N];
int n;
void add(int k,int x){
for(int i=k;i<=n;i+=lowbit(i)) tr[i]+=x;
}
int query(int k){
int res=0;
for(int i=k;i;i-=lowbit(i)) res+=tr[i];
return res;
}
int ask(int l,int r){// 先左再右
return query(r)-query(l-1);
}
void clear(){
for(int i=0;i<=n+2;i++) tr[i]=0;
}
}T;
简单运用考虑逆序对,或者是二维偏序。按照某一个维度排序同时要求另一个维度的逆序的数量
常用区间问题
如果题目要求满足某个性质要求的区间的数量
同时我们对于其化简可以得到的是$c_r$-$t_r$ > $c_{l-1}$-$t_{l-1}$
即是下标可以化简到统一的方式的话那就是可行的利用树状数组(是否是开两倍空间或者是先离散化处理)
模板题
给定数组求解要求中位数是x的区间的数量
第一步发现是求解区间问题,同时要是直接求是中位数是x的区间比较困难因为难以用式子表示但是如果可以转化为中位数大于等于x的话那就是区间中大于等于x的数比小于x的数多即可
第二步可以推理出式子 恰好等于x==大于等于x - 大于等于x+1
第三步[l,r] 可以发现的是 化简呈现这样的$c_r$-$t_r$ > $c_{l-1}$-$t_{l-1}$
所以可以利用树状数组来维护前缀和(典型)