zoukankan      html  css  js  c++  java
  • 浅谈树状数组

    最近学了树状数组,给我的感觉就是 这个数据结构好神奇啊^_^

    首先他的常数比线段树小,其次他的实现复杂度也远低于线段树 (并没有黑线段树的意思=-=)

    所以熟练掌握他是非常有必要的。。

    关于树状数组的基础知识与原理网上一搜一大堆,我就不赘述了,就谈一些树状数组的应用好了

    (推荐一篇写得比较好的博客:https://www.cnblogs.com/ECJTUACM-873284962/p/6380245.html

    1,单点修改,求区间和

    #define lowbit(x) (x&-x)  // 设 x 的末尾零的个数为 y , 则 lowbit(x) == 2^y 。 -x表示的是x在二进制中的补码
    void
    Update(int i,int v) // 初始化与单点修改 { while(i <= n) { c[i] += v ; i += lowbit(i) ; } } inline int Sum(int i) // 区间求和 { int res = 0 ; while(i > 0) { res += c[i] ; i -= lowbit(i) ; } return res ; }

    2,区间修改,单点查询

    这里要用到差分的思想

    创建一个差分数组c[],令c[i] = a[i] - a[i-1] (a[i] 表示原本的第i个数) 

    则a[i] = ( a[i] - a[i-1] ) + ( a[i-1] - a[i-2] ) + ...... + ( a[2] - a[1] ) +a[1] 

             = c[i] + c[i-1] + ...... + c[2] + c[1] 

    所以单点查询变成了区间求和

    那么区间修改怎么办呢 ?

    我们看这样一个例子:

    a 1 3 4 5 7 10

    c 1 2 1 1 2 3

    若我们令区间[2,4]加2,则

    a 1 5 6 7 9 10

    c 1 4 1 1 2 1 

    我们可以发现只有c[2]和c[5]的数值改变了,其实原理也很好想,区间内的前后元素差是不变的,只有(区间第一个元素与前一个元素的差) 和 (区间后第一个元素与区间末尾元素的差) 改变了。所以区间修改问题变成了单点修改问题。

            for(int i=1;i<=n;i++)
        {
            a[i] = read() ;
            Update(i,a[i]-a[i-1]);
        } 
    /*    int x=0,y=0;       // 注释掉的内容是空间上的优化(初学者建议先跳过)
        for(int i=1;i<=n;i++)
        {
            if(i%2)
            {
                x = read() ;
                Update(i,x-y);
            }
            else
            {
                y = read() ;
                Update(i,y-x) ;
            }
        }  */
        int ii ;
        int k,x,y;
        for(int i=1;i<=m;i++)
        {
            ii = read() ;
            if(ii == 1)
            {
                x = read() ; y = read() ; k = read() ;
                Update(x,k);
                Update(y+1,-k);
            }
            if(ii == 2)
            {
                x = read() ;
                printf("%d
    ",Sum(x));
            }
        }

    (洛谷有对应的模板题 P3374 与 P3368)

    上述就是树状数组最基础的两个应用,日后更深入的学习后再来更新。

    ——end ; 

  • 相关阅读:
    [恢]hdu 1548
    [恢]hdu 2102
    [恢]hdu 1238
    [恢]hdu 2564
    [恢]hdu 2565
    关于mmu,bootloader,dta以及各种乱七八糟
    总有那些让人XX的词语
    VS2005+SQL2005 Reporting Service动态绑定报表(Web)
    (已测试)在本地处理模式下将数据库数据源与 ReportViewer Web 服务器控件一起使用
    如何在单台计算机上安装 Reporting Services
  • 原文地址:https://www.cnblogs.com/zub23333/p/7670436.html
Copyright © 2011-2022 走看看