• 树状数组


    树状数组的应用:

      1.单点修改,区间查询。

       2.区间修改,单点查询。

       3.区间修改,区间查询。

      实际求解问题的时候经常会用树状数组来维护一个区间,因为相比线段树来说树状数组常数比较优越而且代码实现上比较容易,空间需要也比较少。

    应用模板:

      1.单点修改,区间查询。

     

    #include<bits/stdc++.h>
    using namespace  std;
    #define ll long long
    #define INF 0x3f3f3f3f
    #define maxn 1000009
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ll)(ch-'0');ch=getchar();}
        return x*f;
    }
    ll sum[maxn];
    ll n,m,k,ans,tot;
    
    ll lowbit(ll x)
    {
        return x&(-x);
    }
    void add(ll x,ll y)
    {
        while(x<=n)
        {
            sum[x]+=y;
            x+=lowbit(x);
        }
    }
    ll Query(ll l)
    {
        ans=0;
        while(l>0)
        {
            ans+=sum[l];
            l-=lowbit(l); 
        }
        return ans;
    }
    int main()
    {
    //    freopen(".in","r",stdin);
    //    freopen(".out","w",stdout);
        n=read(),m=read();
        for(int i=1;i<=n;i++)
        {
            ll x=read();
            add(i,x);
        }
        for(int i=1;i<=m;i++)
        {
            ll opt=read(),l=read(),r=read();
            if(opt==1)
                add(l,r);
            else 
                printf("%d
    ",Query(r)-Query(l-1));
        }
    //    fclose(stdin);
    //    fclose(stdout);
        return 0;
    }

      2.区间修改,单点查询。

      Matrix:http://poj.org/problem?id=2155

    #include<iostream>
    #include<cmath>
    #include<cstdio>
    #include<cstdlib>
    #include<algorithm>
    #include<cstring> 
    using namespace std;
    #define re register int 
    #define ll long long
    #define INF 0x3f3f3f3f
    #define maxn  1009
    #define maxm
    inline ll read()
    {
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ll)(ch-'0');ch=getchar();}
        return x*f;
    }
    int sum[maxn][maxn];
    int n,m,k,ans,tot,T; 
    
    int lowbit(int x)
    {
        return x&(-x);
    }
    void add(int x,int y,int z)
    {
        for(re i=x;i<=n;i+=lowbit(i))
            for(re j=y;j<=n;j+=lowbit(j))
                sum[i][j]+=z;
    }
    
    int Query(int x,int y)
    {
        int ans=0;
        for(re i=x;i>0;i-=lowbit(i))
            for(re j=y;j>0;j-=lowbit(j))
                ans+=sum[i][j];
        return ans;
    }
    int main()
    {
    //    freopen(".in","r",stdin);
    //    freopen(".out","w",stdout);
        T=read();
        for(re t=1;t<=T;t++)
        {
            memset(sum,0,sizeof(sum));
            n=read(),m=read();
            for(re i=1;i<=m;i++)
            {
                char ch;int a,b,c,d;
                cin>>ch;
                if(ch=='C')
                {
                    a=read(),b=read(),c=read(),d=read();
                    add(a,b,1),add(c+1,d+1,1),add(a,d+1,-1),add(c+1,b,-1);
                }
                else
                {
                    a=read(),b=read();
                    printf("%d
    ",Query(a,b)%2);
                }
            }
            puts("");
        }
        fclose(stdin);
        fclose(stdout);
        return 0;
    }

     3.区间修改,区间查询。

  • 相关阅读:
    Qt5官方demo解析集21——Extending QML
    多封装,少开放。强烈建议C++标准添加class之间的注入机制
    iOS 设计模式之工厂模式
    golang的select典型用法
    Go的异常处理 defer, panic, recover
    Visual Studio Code 的简单试用体验
    在Visual Studio Code中配置GO开发环境
    Go语言开发环境配置
    Go 语言 很牛
    Go将统治下一个10年?Go语言发展现状分析
  • 原文地址:https://www.cnblogs.com/Dxy0310/p/9749253.html
Copyright © 2020-2023  润新知