數據結構:樹狀數組


樹狀數組可以修改點查詢區間和,其修改和查詢都是平衡樹級別的

其實它本身就是一顆差不多的樹

具體原理這里不再敘述,因為已經忘了。。

下面直接給出相應的函數:

修改點:

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 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM