zoukankan      html  css  js  c++  java
  • 【转】【小结】树状数组的区间修改与区间查询

    垃圾的我以前并不会树状数组区间修改+区间查询,233

    第一次听到树状数组是zsl来讲课QAQ 然后当时他给我们绕了很久 = = 嗯没懂…………结果后来发现这东西实际上是个简单又好用的玩意QAQ

    不知道以后的题还会不会用了 因为感觉好像树状数组的题一般都比较简单orz。。

    [ 1 ]  树状数组的本职是单点修改+区间查询 维护前缀和 每次修改向上传数据 然后查询区间的时候也是从下往上加值 函数很好写……

    修改:

    [cpp] view plain copy
     
    1. void update(int i, int x)  
    2. {  
    3.     while(i <= N){  
    4.          sum[i] += x;  
    5.          i += lowbit(i);  
    6.     }  
    7. }  


    查询前缀和:

    [cpp] view plain copy
     
    1. int Query(int i)  
    2. {  
    3.     int temp = 0;  
    4.     while(x > 0){  
    5.          temp += sum[i];  
    6.          i -= lowbit(i);  
    7.     }  
    8.     return temp;  
    9. }  



    [ 2 ]  鉴于树状数组的空间复杂度和时间复杂度都比线段树小 而且代码也短 所以就有大神用强大的脑洞YY出了区间修改+单点查询的树状数组

     = =我的想法是保存原始数列a数组 然后引入delta数组(差分数组) 查询的时候求delta数组的前缀和 再加上原始的a数组就可以了 网上的资料似乎和我的方法不太一样但是……应该也差不多吧……按我的方法的话 代码和上面也差不多 把sum改成delta就行了

    [ 3 ]  上面都不是重点……重点是树状数组的区间修改+区间查询 这个很好玩 其实也挺简单

    首先依旧是引入delta数组 delta[i]表示区间 [i, n] 的共同增量 于是修改区间 [l, r] 时修改 delta[l] 和 delta[r + 1] 即可(就是差分的思路)

    查询的时候是查询区间 [l, r] 的和 即sum[r] - sum[l - 1] 所以现在的问题是求sum[i]

    [cpp] view plain copy
     
    1. sum[i] = a[1]+...+a[i] + delta[1]*i + delta[2]*(i - 1) + delta[3]*(i - 2)+...+delta[i]*1   // a[i]为原始数组  
    2.        = sigma( a[x] ) + sigma( delta[x]  *  (i + 1 - x) )  
    3.        = sigma( a[x] ) + (i + 1) * sigma( delta[x] ) - sigma( delta[x] * x )  


    其中 sigma( a[x] ) 是可以预处理出来的 于是只需要维护 delta[x] 与 delta[x] * x 的前缀和(作为两个树状数组就可以了)

    为了试验这个方法我专门去找了之前写线段树挂了好久的例题 = = codevs1082 线段树练习3 

    然后交树状数组的代码是 324ms 内存5M过了 线段树是1027ms 13M 如果去掉读入优化的话代码会更短。

    转自:http://blog.csdn.net/qq_21841245/article/details/43956633

  • 相关阅读:
    转一篇:arp欺骗的原理和防御
    CF1209A Paint the Numbers
    字符串专题之KMP算法
    CF1209B Koala and Lights
    CF1217A Creating a Character
    CF1217B Zmei Gorynich
    各种模板
    开通博客园拉..
    汇编语言程序设计学习笔记(第一遍学习)第4节:汇编就像HTML一样简单
    我也要学C语言第二十章:结构体类型变量,结构体数组
  • 原文地址:https://www.cnblogs.com/Konjakmoyu/p/5981935.html
Copyright © 2011-2022 走看看