zoukankan      html  css  js  c++  java
  • 高级数据结构--树状数组

        本地搬运~

         关于树状数组的学习,强烈推荐这个视频:https://www.bilibili.com/video/av26371798?from=search&seid=2141442207537065040

        1:树状数组:查询和修改复杂度都为log(n)的数据结构,本身可用于单点修改区间查询,加入辅助数组后可实现区间修改:POJ3468

         2:参考视频,我整理了这张图:

         单点更新:

    cin>>x;
    update(i,x);
    void update(int id,int x)
    {
        for(int i=id;i<=n;i+=lowbit(i))
            c[i]+=x;
    }

         查询[L,R]的区间和

    cin>>i>>j;
    cout<<getsum(j)-getsum(i-1)<<endl;
    int getsum(int id)
    {
        int sum=0;
        for(int i=id;i>=1;i-=lowbit(i))
            sum+=c[i];
        return sum;
    }

        lowbit求的是C[i]的i变为二进制后,从右往左找到第一个1的出现位置,固定这个1,其他全为0,再化为十进制。

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

        HDU1166:基本板子题:

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    const int maxn=5e4+10;
    int c[maxn],n;
    int lowbit(int i)
    {
        return i&(-i);
    }
    void update(int id,int x)
    {
        for(int i=id;i<=n;i+=lowbit(i))
            c[i]+=x;
    }
    int getsum(int id)
    {
        int sum=0;
        for(int i=id;i>=1;i-=lowbit(i))
            sum+=c[i];
        return sum;
    }
    int main()
    {
        int t;
        cin>>t;
        int ac=1;
        while(t--)
        {
            printf("Case %d:
    ",ac++);
            cin>>n;
            int x;
            memset(c,0,sizeof(c));
            for(int i=1;i<=n;i++)
            {
                cin>>x;
                update(i,x);
            }
            string ch;
            while(cin>>ch)
            {
                    if(ch=="End")
                    {
                        break;
                    }
                    if(ch=="Add")
                    {
                        int i,j;
                        cin>>i>>j;
                        update(i,j);
                    }
                    if(ch=="Sub")
                    {
                        int i,j;
                        cin>>i>>j;
                        update(i,-j);            
                    }
                    if(ch=="Query")
                    {
                        int i,j;
                        cin>>i>>j;
                        cout<<getsum(j)-getsum(i-1)<<endl;
                    }
            }
        }
    }

         区间修改传送门:https://i-beta.cnblogs.com/posts?cateId=1758687

  • 相关阅读:
    KVM安装以及远程连接
    开博客祭
    CQOI 2021
    琐记——学长们
    大事祭
    关于洛谷与博客园的博客的一些声明
    CSP-S 2020 & NOIP 2020 日记与游记
    调和级数
    快速乘
    二叉堆
  • 原文地址:https://www.cnblogs.com/liyexin/p/12838842.html
Copyright © 2011-2022 走看看