zoukankan      html  css  js  c++  java
  • 数据结构:树状数组

    树状数组可以修改点查询区间和,其修改和查询都是平衡树级别的

    其实它本身就是一颗差不多的树

    具体原理这里不再叙述,因为已经忘了。。

    下面直接给出相应的函数:

    修改点:

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

    查询区间和:

    int sum(int x)
    {
        int ans=0;
        while(x>0)
        {
            ans+=c[x];
            x-=lowbit(x);
        }
        return ans;
    }

    在使用树状数组的时候,一定要注意题目给出的数据范围,千万不要忘记开long long

    下面给出完整实现,这篇博文确实太水了。。

     1 //aininot260 修改点,查询区间和
     2 #include<iostream>
     3 using namespace std;
     4 const int maxn=100005;
     5 const int maxm=10005;
     6 int n,m;
     7 int a[maxn];
     8 int c[maxn];
     9 int lowbit(int x)
    10 {
    11     return x&(-x);
    12 }
    13 void update(int x,int y)
    14 {
    15     while(x<=n)
    16     {
    17         c[x]+=y;
    18         x+=lowbit(x);
    19     }
    20 }
    21 int sum(int x)
    22 {
    23     int ans=0;
    24     while(x>0)
    25     {
    26         ans+=c[x];
    27         x-=lowbit(x);
    28     }
    29     return ans;
    30 }
    31 int main()
    32 {
    33     cin>>n;
    34     for(int i=1;i<=n;i++) cin>>a[i];
    35     for(int i=1;i<=n;i++) update(i,a[i]);
    36     cin>>m;
    37     for(int i=1;i<=m;i++)
    38     {
    39         int x,y,z;
    40         cin>>x>>y>>z;
    41         if(x==1) update(y,z);
    42         if(x==2) cout<<sum(z)-sum(y-1)<<endl;
    43     }
    44     return 0;
    45 }
  • 相关阅读:
    刷题238. Product of Array Except Self
    刷题236. Lowest Common Ancestor of a Binary Tree
    刷题208. Implement Trie (Prefix Tree)
    A1070
    A1048
    A1050
    A1041
    A1092
    A1084
    n进制转十进制
  • 原文地址:https://www.cnblogs.com/aininot260/p/9304826.html
Copyright © 2011-2022 走看看