30分求助
查看原帖
30分求助
80231
pumpkin_porridge楼主2024/9/15 19:44

调long long,取模等问题都检查了一遍仍然不行,求调

#include<iostream>

using namespace std;

int m,n,q;
long long a[100004];

struct SegTreeNode
{
    int lran,rran;
    long long val,tag_add,tag_mult;
    SegTreeNode *left,*right;

    SegTreeNode()=default;
    SegTreeNode(int l,int r):lran(l),rran(r),tag_add(0),tag_mult(1),left(nullptr),right(nullptr)
    {
        val=0;
        for(int i=lran;i<=rran;i++) val=(val+a[i])%m;
    }
    ~SegTreeNode()
    {
        if(left) {delete left; left=nullptr;}
        if(right) {delete right; right=nullptr;}
    }
    void check()
    {
        if(!left && lran!=rran) left=new SegTreeNode(lran,(lran+rran)/2);
        if(!right && lran!=rran) right=new SegTreeNode((lran+rran)/2+1,rran);
    }

    void pushdown()
    {
        if(tag_add==0 && tag_mult==1) return;
        if(lran==rran)
        {
            tag_add=0;tag_mult=1;return;
        }
        check();
        left->tag_mult = (left->tag_mult * tag_mult)%m;
        right->tag_mult = (right->tag_mult * tag_mult)%m;
        left->tag_add = (left->tag_add * tag_mult %m + tag_add%m) %m;
        right->tag_add = (right->tag_add * tag_mult %m + tag_add%m) %m;
        left->val = (left->val * tag_mult %m + tag_add * (left->rran - left->lran + 1) %m) %m;
        right->val = (right->val * tag_mult %m + tag_add * (right->rran - right->lran +1) %m) %m;
        tag_add=0;tag_mult=1;
    }

};

struct SegTree
{
    SegTreeNode *root;

    SegTree()=default;
    SegTree(int l,int r)
    {
        root=new SegTreeNode(l,r);
    }
    ~SegTree()
    {
        delete root;
        root=nullptr;
    }

    void add(SegTreeNode *node,int x,int y,int k)
    {
        if(x==node->lran && y==node->rran)
        {
            node->tag_add+=k;
            node->val+=k*(node->rran - node->lran +1);
            return;
        }//lran=rran already returns here
        int mid = (node->lran + node->rran)/2;
        node->check();
        node->pushdown();
        if(y<=mid)
        {
            add(node->left,x,y,k);
        }
        else if(x>=mid+1)
        {
            add(node->right,x,y,k);
        }
        else
        {
            add(node->left,x,mid,k);
            add(node->right,mid+1,y,k);
        }
        node->val = (node->left->val + node->right->val) %m;
    }

    void mult(SegTreeNode *node,int x,int y,int k)
    {
        if(x==node->lran && y==node->rran)
        {
            node->tag_mult*=k;
            node->val*=k;
            node->tag_add*=k;
            return;
        }//lran=rran already returns here
        int mid = (node->lran + node->rran)/2;
        node->check();
        node->pushdown();
        if(y<=mid)
        {
            mult(node->left,x,y,k);
        }
        else if(x>=mid+1)
        {
            mult(node->right,x,y,k);
        }
        else
        {
            mult(node->left,x,mid,k);
            mult(node->right,mid+1,y,k);
        }
        node->val = (node->left->val + node->right->val) %m;
    }

    long long sum(SegTreeNode *node,int x,int y)
    {
        if(x==node->lran && y==node->rran) return node->val %m;//lran==rran already returns here
        int mid=(node->lran + node->rran)/2;
        node->check();
        node->pushdown();
        if(y<=mid)
        {
            return sum(node->left,x,y) %m;
        }
        else if(x>=mid+1)
        {
            return sum(node->right,x,y) %m;
        }
        else
        {
            return (sum(node->left,x,mid) + sum(node->right,mid+1,y))%m;
        }
    }
};

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

    SegTree Tree(1,n);

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