还剩四天
想重新学树状数组的起因是洛谷P1966
其实这题和树状数组关系不大,只是求逆序对的时候要用到,反正之前不会,就去看了一下,我本来因为会线段树所以基本没有学树状数组,但树状数组的常数更小,用起来也更方便,所以记录下来。
基础
名为lowbit的函数,设k为x的最低位的1,那么lowbit可以算出2^(k-1)。
具体数学证明我也不会,总之记下来就行了。
inline int lowbit(int k)
{
return (k&(-k));
}
组成部分
树状数组基本只有两种操作,单点修改和区间查询,区间查询查询的是前缀和,所以可以相减求得一段区间。
单点修改
void add(int i)
{
while(i<=n)
{
c[i]++;
c[i]=c[i];
i+=lowbit(i);
}
}
求前缀和
ll getsum(int i)
{
ll sum=0;
while(i>0)
{
sum+=c[i];
sum=sum;
i-=lowbit(i);
}
return sum;
}