码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 0017:【模板】树状数组


    题目链接:https://www.luogu.com.cn/problem/P3374

    题目描述:

    已知一个数列,你需要进行下面两种操作:

    1.将某一个数加上 x

    2.求出某区间每一个数的和

    看到这道题,首先想到的是直接数组模拟。

    不用多说了吧?是人都会。

    但是数组模拟求区间和的单次时间复杂度是O(n),本题的数据范围最大是(5*10^5)^2,很容易爆掉。(本题只有70分)

    那么就要介绍一下这次的算法——树状数组了。

    树状数组或二叉索引树,最早由Peter M. Fenwick于1994年以A New Data Structure for Cumulative Frequency Tables为题发表在SOFTWARE PRACTICE AND EXPERIENCE。其初衷是解决数据压缩里的累积频率(Cumulative Frequency)的计算问题,现多用于高效计算数列的前缀和, 区间和。

    ——摘自百度

    说白了就是能让区间和计算变快的算法。我画个图演示一下大概的思想。

     

     

     C1=A1

    C2=A1+A2

    C3=A3

    C4=A1+A2+A3+A4

    C5=A5

    C6=A5+A6

    C7=A7

    C8=A1+A2+A3+A4+A5+A6+A7+A8

     

     C数组就是像树一样将A数组的区间联系起来的树状数组。

    那么如何用C数组找到A数组呢?

    这就用到一条神奇的语句:

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

    大家可以自行上c++模拟一下。

    上代码:

    复制代码
     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int A[500005],C[500005];
     4 int n,m,i,j,a,b,c;
     5 int lowbit(int x){//实现A数组与C数组的转换 
     6     return x&(-x);
     7 }
     8 void add(int w,int k){//将序列内某个元素加上k 
     9     while(w<=n){//将每个C数组中包含此元素的元素都加上k 
    10         C[w]+=k;
    11         w+=lowbit(w);
    12     }
    13 }
    14 int Q(int x){//从A1到Ax的区间和,用C数组求 
    15     int we=0;
    16     while(x>0){
    17         we+=C[x];
    18         x-=lowbit(x);//从x搜索,找出之前不包含A1~Ax的元素 
    19     }
    20     return we;
    21 }
    22 int main(){
    23     cin>>n>>m;
    24     for(i=1;i<=n;i++){
    25         scanf("%d",&A[i]);
    26         add(i,A[i]);
    27     }
    28     for(i=0;i<m;i++){
    29         scanf("%d",&a);
    30         if(a==1){
    31             scanf("%d%d",&b,&c);
    32             add(b,c);
    33         }else{
    34             scanf("%d%d",&b,&c);
    35             cout<<Q(c)-Q(b-1)<<endl;
    36         }
    37     }
    38 }
    复制代码

     

  • 相关阅读:
    网络方向哪个发展更好?数据通信工程师学习路线分享
    传统用户管理方案有哪些利弊?
    vue3.0的学习
    经纬恒润预期功能安全(SOTIF)解决方案为自动驾驶安全保驾护航
    ElasticSearch与Lucene是什么关系?Lucene又是什么?
    七、Request&Response
    「网页开发|前端开发|Vue」10 vuex模块化:将数据划分成不同modules分别管理
    国内唯一|阿里云入选 Gartner 应用性能监控与可观测魔力象限
    开源数据集分享———猫脸码客
    航天航空VR科普展VR太空科技馆沉浸式遨游体验
  • 原文地址:https://www.cnblogs.com/wdrdsahudhisjabshdahuhsh/p/16469237.html
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号