zoukankan      html  css  js  c++  java
  • 树状数组总结

    这次复习树状数组主要加深了对于原理的理解。

    树状数组是什么?

    树状数组由3个部分组成:

    1.lowbit()//求lowbit值   lowbit(x)=x&(-x)//这个比较方便,记住就好。

    int lowbit(int x){
        return x&(-x);
    }

    2.update()//修改

    void update(int p,int w){
        while(p<=n){
            c[p]+=w;
            p+=lowbit(p);
        }
    }

    3.sum()//求和

    long long int sum(int p){
        long long int tot=0;
        while(p){
            tot+=c[p];
            p-=lowbit(p);
        }
        return tot;
    }

    树状数组能干什么?

    1.(一维和二维)单点修改,区间查询

    2.(一维和二维)区间修改,单点查询

    3.(一维和二维)区间修改,区间查询

    4.(一维和二维)区间修改,区间查询

    树状数组中数组C[X]的含义是什么?

    C【X】表示的是[X-lowbit(x),X]的区间和。

    update更新的是什么?

    如果在x位加上w,每次更新c[x+lowbit(x)],其实就是从更新[1,x+lowbit(x)],所以求和的时候不会重复加上w.

    单点修改怎么办?

    单点修改只需要弄一个差分数组就行了。

    二维树状数组:

    每次操作的时间复杂度是((log(n))^2)。

    (区间修改,区间查询)(区间修改,区间查询)

    为什么要用差分,因为区间修改如果不用差分得每个每个修改,时间复杂度过不去。

  • 相关阅读:
    Two Sum
    Binary Tree Preorder Traversal *
    Rotate Array
    Repeated DNA Sequences
    Symmetric Tree
    Path Sum
    Python初学——多线程Threading
    Python初学——窗口视窗Tkinter
    pyinstaller打包多个py文件和去除cmd黑框
    python获取当前路径
  • 原文地址:https://www.cnblogs.com/sky-zxz/p/9636976.html
Copyright © 2011-2022 走看看