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


    传送门:

    #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('
    ');
            }
        }
        return 0;
    }
  • 相关阅读:
    7.1类模板
    异质链表
    8.1多态性
    8.2虚函数
    error: C2664: “zajiao::zajiao(const zajiao &)”: 无法将参数 1 从“const char [12]”转换为“char *”
    #include <QPushButton>
    6.3多重继承
    华为集群后killsql命令和查看mr占用的磁盘空间
    linux的逻辑运算符
    test命令
  • 原文地址:https://www.cnblogs.com/acm1ruoji/p/10792639.html
Copyright © 2020-2023  润新知