zoukankan      html  css  js  c++  java
  • 【模板】树状数组(区间修改+单点查询)

    用到了差分。

    对于原序列(a[]),我们的差分数组(c[]),有(c[i]=a[i]-a[i-1])

    在差分玄学中,我们有(a[j]=sum_{i=1}^j c[i])

    修改区间时,例如将区间(x...y)加上一个值(delta),就直接 (c[x]+=delta; c[y+1]-=delta) 实现。

    于是我们的

    单点查询(----->)求查分数组前缀和

    区间修改(----->)修改两点

    是不是就可以套树状数组区间求和单点修改的模板了qwq!!!

    #include <iostream>
    using namespace std;
    int n,m;
    int c[500001]={};
    int lowbit(int a){return a&-a;}
    void add(int k,int x)
    {
        while (k<=n)
        {
            c[k]+=x;
            k+=lowbit(k);
        }
        return;
    }
    int num(int xd)
    {
        int sum=0;
        while (0<xd)
        {
            sum+=c[xd];
            xd-=lowbit(xd);
        }
        return sum;
    }
    int main()
    {
        cin>>n>>m;
        int first,next;
        cin>>first;
        add(1,first);
        for (int i=2;i<=n;i++)
        {
            cin>>next;
            add(i,next-first);
            first=next;
        }
        for (int i=1;i<=m;i++)
        {
            int s;
            cin>>s;
            if (s==1)
            {
                int x,y,k;
                cin>>x>>y>>k;
                add(x,k);
                add(y+1,-k);
                continue;
            }
            int x;
            cin>>x;
            cout<<num(x)<<endl;
        }
        return 0;
    }
    
  • 相关阅读:
    yum 安装pip
    sed和awk用法
    awk删除最后一个字符
    shell读取文件内容并进行变量赋值
    git 添加、提交、推送
    git 本地代码冲突解决,强制更新
    sys系统模块
    os模块
    time-时间模块
    环境变量的使用
  • 原文地址:https://www.cnblogs.com/Kan-kiz/p/10620860.html
Copyright © 2011-2022 走看看