线段树入门 区间求和,区间更新。

题目链接:https://cn.vjudge.net/problem/POJ-3468

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
#include <cstdio>
#include <algorithm>
using namespace std;
typedef long long ll;
const int maxn=100000;
const int maxsize=4*maxn;

struct Node
{
    ll sum;
    ll tag;
};

Node data[maxsize];

void add(int v,int a,int b,int k,int l,int r)
{
    if(b<=l||a>=r)
        return;
    if(a<=l&&b>=r)
        data[k].tag+=v;
    else
    {
        data[k].sum+=(min(r,b)-max(l,a))*v;
        add(v,a,b,2*k+1,l,(l+r)/2);
        add(v,a,b,2*k+2,(l+r)/2,r);
    }
}

ll query(int a,int b,int k,int l,int r)
{
    if(b<=l||a>=r)
        return 0;
    if(a<=l&&b>=r)
        return data[k].tag*(r-l)+data[k].sum;

    ll sum=0;
    sum+=data[k].tag*(min(r,b)-max(l,a));
    sum+=query(a,b,2*k+1,l,(l+r)/2);
    sum+=query(a,b,2*k+2,(l+r)/2,r);

    return sum;
}

int main()
{
    int n,q,t,a,b;
    char c;
    scanf("%d%d",&n,&q);

    for(int i=0;i<n;++i)
    {
        scanf("%d",&t);
        add(t,i,i+1,0,0,n);
    }

    while(q--)
    {
        scanf("%*c%c%d%d",&c,&a,&b);
        if(c=='Q')
            printf("%lld\n",query(a-1,b,0,0,n));
        else
        {
            scanf("%d",&t);
            add(t,a-1,b,0,0,n);
        }
    }

    return 0;
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄