10分求调
查看原帖
10分求调
80231
pumpkin_porridge楼主2024/9/13 12:21

也不知道为什么还能有10分(笑)

#include<iostream>
#include<cstdio>

using namespace std;
int n,q,m,a[100004];

int ncnt=1;
struct Segnode
{
    int lran,rran,tag_add;
    long long val;
    Segnode *left,*right;

    void init(int lr,int rr)
    {
        lran=lr;rran=rr;val=0;tag_add=0;
        for(int i=lran;i<=rran;i++) val+=a[i];
        left=nullptr; right=nullptr;
    }
    void pushdown();
    void add(int x,int y,int k);
    //void mult(int x,int y,int k);
    long long sum(int x,int y);
}nodes[200008];

void checkchild(Segnode& node)
{
    if(node.left==nullptr && node.lran!=node.rran)
    {
        nodes[++ncnt].init(node.lran,(node.lran+node.rran)/2);
        node.left=&nodes[ncnt];
    }
    if(node.right==nullptr && node.lran!=node.rran)
    {
        nodes[++ncnt].init((node.lran+node.rran)/2+1,node.rran);
        node.right=&nodes[ncnt];
    }
}

void Segnode::pushdown()
{
    left->tag_add += tag_add;
    right->tag_add += tag_add;

    left->val += tag_add*(left->rran - left->lran + 1);
    right->val += tag_add*(right->rran - right->lran + 1);

    tag_add=0;
}


void Segnode::add(int x,int y,int k)
{
    if(lran==x && rran==y)
    {
        tag_add+=k;
        val+=k*(rran-lran+1);
        return;
    }

    checkchild(*this);

    int mid=(lran+rran)/2;
    if(y<=mid)
    {
        left->add(x,y,k);
    }
    else if(x>=mid+1)
    {
        right->add(x,y,k);
    }
    else
    {
        left->add(x,mid,k);
        right->add(mid+1,y,k);
    }
    val= left->val + right->val;
}

long long Segnode::sum(int x,int y)
{
    if(lran==x && rran==y) return val;
    checkchild(*this); pushdown();
    int mid=(lran+rran)/2;
    if(y<=mid)
    {
        return left->sum(x,y);
    }
    if(x>=mid+1)
    {
        return right->sum(x,y);
    }

    return left->sum(x,mid) + right->sum(mid+1,y);
}


int main()
{
    cin>>n>>q;//>>m;
    for(int i=1;i<=n;i++) cin>>a[i];

    Segnode& root=nodes[1];
    root.init(1,n);

    for(int i=1;i<=q;i++)
    {
        int op,x,y,k;
        cin>>op;
        if(op==1)
        {
            cin>>x>>y>>k;
            root.add(x,y,k);
        }
        if(op==2)
        {
            cin>>x>>y;
            cout<<root.sum(x,y)<<endl;
        }
    }
    return 0;
}
2024/9/13 12:21
加载中...