区间维护区间查询(树状数组)

Posted acm1ruoji

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了区间维护区间查询(树状数组)相关的知识,希望对你有一定的参考价值。

传送门:

#include <cstdio>
#include <cstring>
#include <cmath>
#include <string>
#include <sstream>
#include <cstdlib>
#include <algorithm>
#include <iostream>
#include <set>
#include <map>
#include <vector>
#include <queue>
#include <stack>
#include <functional>
using namespace std;
#define ll long long
#define re register
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define P pair<int,int>
const int N=1e6+10;
void read(ll &a)
{
    int d=1;
    char ch;
    a=0;
    while(ch=getchar(),!isdigit(ch))
        if(ch==-)
            d=-1;
    a=ch^48;
    while(ch=getchar(),isdigit(ch))
        a=(a<<3)+(a<<1)+(ch^48);
    a*=d;
}
void write(ll x)
{
    if(x<0)
        putchar(45),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+0);
}
ll tree1[N],tree2[N];
ll n,T;
ll lowbit(ll x){return x&-x;}
void add(ll *x,ll i,ll c)
{
    while(i<=n)
    {
        x[i]+=c;
        i+=lowbit(i);
    }
}
ll sum(ll *x,ll i)
{
    ll ans=0;
    while(i>0)
    {
        ans+=x[i];
        i-=lowbit(i);
    }
    return ans;
}
int main()
{
    //freopen("out.txt","w",stdout);
    read(n);
    read(T);
    for(re ll i=1;i<=n;i++)
    {
        ll x;
        read(x);
        add(tree1,i,x);
    }
    while(T--)
    {
        ll f;
        read(f);
        if(f==1)
        {
            ll l,r,x;
            read(l);
            read(r);
            read(x);
            add(tree1,l,-(l-1)*x);///在l的位置减去(l-1)*x是因为l之前的没有加x,而后面在r+1位置加的r*x包含(l-1)段,所以此处减去(l-1)*x
            add(tree1,r+1,r*x);
            add(tree2,l,x);///记录在该位置加了个x.
            add(tree2,r+1,-x);
        }
        else
        {
            ll l,r;
            read(l);
            read(r);
            ll ans=0;
            ans+=sum(tree1,r)+sum(tree2,r)*r;
            ans-=sum(tree1,l-1)+sum(tree2,l-1)*(l-1);
            write(ans);
            putchar(\n);
        }
    }
    return 0;
}

 

以上是关于区间维护区间查询(树状数组)的主要内容,如果未能解决你的问题,请参考以下文章

树状数组

树状数组

树状数组

P3372 模板线段树 1(区间修改区间查询)(树状数组)

poj3468区间加减查找——树状数组区间修改查询

树状数组