• P3374 【模板】树状数组 1


    ---------------------------------------------------

    链接:P3374 【模板】树状数组 1

    -------------------------------------------------------

    树状数组是个很有用的数据结构,当然,有许多时候我们也可以用线段树代替他。

    不过线段树比树状数组难得多,所以应该是用树状数组代替线段树才对。

    比如说看看这个:[洛谷日报第22期]可以代替线段树的树状数组?

    ------------------------------------------------------

    树状数组是一种基于二进制思想实现的数据结构,要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值;经过简单修改可以在log(n)的复杂度下进行范围修改,但是这时只能查询其中一个元素的值(如果加入多个辅助数组则可以实现区间修改与区间查询)。然而在洛谷上,这两部分是分开的。这个模板一实现的是单点修改和区间之和。

    还有,这和前缀和有关系。

    -----------------------------------------------------

    特别的,

    不知道前缀和/差分?请看这位大佬
    ------------------------------------------------------

    由于树状数组涉及到了深奥的二进制,理解原理请看这篇blog

    -------------------------------------------------------

    以下为代码:

     1 #include<iostream>
     2 
     3 using namespace std;
     4 int f,x,y;
     5 int n,m;
     6 int now;
     7 int t[500001];
     8 int lowbit(int x){
     9     return x& -x;
    10 }
    11 void add(int p,int x){
    12     while(p<=n){
    13         t[p]+=x;
    14         p+=lowbit(p);
    15     }
    16 }
    17 
    18 int sum(int x){
    19     int ans=0;
    20     while(x){
    21         ans+=t[x];
    22         x-=lowbit(x);
    23     }
    24     return ans;
    25 }
    26 
    27 int main(){
    28     cin>>n>>m;
    29     for(int i=1;i<=n;++i){
    30         cin>>now;
    31         add(i,now);
    32     }
    33     for(int i=1;i<=m;++i){
    34         cin>>f>>x>>y;
    35         if(f==1){
    36             add(x,y);
    37         }
    38         else
    39         {
    40             cout<<sum(y)-sum(x-1)<<endl;;
    41         }
    42         
    43     }
    44     
    45     return 0;
    46 } 
    Ac
  • 相关阅读:
    logging模块
    解压序列
    python碎片
    python碎片化
    [转]pycharm快捷键
    ios开发之自定义textView
    iOS 开发之字典写入文件
    iOS 开发之内存泄漏问题
    自己写小测试 内容:添加,删除,修改,详情,导出,上传文件,easyui tree树
    使用 jxl 实现复杂的excel 表格导出 java代码
  • 原文地址:https://www.cnblogs.com/For-Miku/p/11246145.html
Copyright © 2020-2023  润新知