在网上翻看了一些博客,感觉大体对于树状数组求逆序对的讲解不够详细,那些博客,更多像是给已经学会逆序对的人复习用的。而初学者,可能要冥思苦想。接下来,我便从一个初学者的角度,来一步步的,讲解一下由树状数组求逆序对。需要的前置知识只有,会线段数组的基本应用。单点更新,区间查询,求lowbit。
先贴树状数组的基本代码。
求lowbit
int lowbit(x){
return x&(-x);}
单点更新
void update(int x,int y,int n){
for(int i=x;i<=n;i+=lowbit(i)) //x为更新的位置,y为更新时增加的数,n为数组最大值
c[i] += y;
}
区间查询
int getsum(int x){
int ans =