2013-team6/BIT

从 Trac 迁移的文章

这是从旧校内 Wiki 迁移的文章,可能存在一些样式问题,您可以向 memset0 反馈。

原文章内容如下:

{{{
一维树状数组
}}}

{{{
创建
BITree t;
清空
t.clear();
将第 k 个数增加 d
t.add(k, d);
查询 0 < i <= k 的 sum(a[i])
t.sum(k);

注意事项:lowbit(0)会陷入死循环,因此数组从1开始
}}}
{{{
const int MAXN = 20005;
typedef int DATA;

struct BITree{
    DATA bit[MAXN];
    void clear(){
        memset(bit, 0, sizeof(bit));
    }
    DATA query(int p){
         int ret=0;
         for (int k = p ; k>0; k -= k & (-k))
             ret+=bit[k];
         return ret;
    }
    void add(int p, DATA q , int n){
         for (int k = p; k<=n; k += k & (-k))
             bit[k]+=q;
    }
    DATA query2(int p,int n){
         int ret=0;
         for (int k = p ; k<=n; k += k & (-k))
             ret+=bit[k];
         return ret;
    }
    void add2(int p, DATA q){
         for (int k = p; k>0; k -= k & (-k))
             bit[k]+=q;
    }
};
}}}

----
== 总结 ==
=== by gantians ===
----
== 练习 ==
=== by gantians ===
 hdu1166  单点更新,区间查询

 hdu1556  区间更新,单点查询

 hdu1541  排序+坐标转化为下标(也可以离散化)

 hdu2689  逆序对。向上更新,向下统计(小于当前值的个数)向下更新,向上统计(大于当前值的个数)
一维树状数组
创建
BITree t;
清空
t.clear();
将第 k 个数增加 d
t.add(k, d);
查询 0 < i <= k 的 sum(a[i])
t.sum(k);
注意事项:lowbit(0)会陷入死循环,因此数组从1开始
const int MAXN = 20005;
typedef int DATA;
struct BITree{
    DATA bit[MAXN];
    void clear(){
        memset(bit, 0, sizeof(bit));
    }
    DATA query(int p){
         int ret=0;
         for (int k = p ; k>0; k -= k & (-k))
             ret+=bit[k];
         return ret;
    }
    void add(int p, DATA q , int n){
         for (int k = p; k<=n; k += k & (-k))
             bit[k]+=q;
    }
    DATA query2(int p,int n){
         int ret=0;
         for (int k = p ; k<=n; k += k & (-k))
             ret+=bit[k];
         return ret;
    }
    void add2(int p, DATA q){
         for (int k = p; k>0; k -= k & (-k))
             bit[k]+=q;
    }
};


总结

by gantians


练习

by gantians

hdu1166 单点更新,区间查询

hdu1556 区间更新,单点查询

hdu1541 排序+坐标转化为下标(也可以离散化)

hdu2689 逆序对。向上更新,向下统计(小于当前值的个数)向下更新,向上统计(大于当前值的个数)