话说算法竞赛可以用内存动态管理吗
查看原帖
话说算法竞赛可以用内存动态管理吗
80231
pumpkin_porridge楼主2024/9/7 22:56

本地运行正常,提交全RE(异常:内存访问非法),请大家帮忙看看

#include<iostream>
#include<cstdio>
using namespace std;

int n,m;
int *a;
void init()
{
    cin>>n>>m;
    int *_a=new int[n+1];
    a=_a;
    for(int i=1;i<=n;i++) cin>>a[i];
}

void deconstruct()
{
    delete[] a;
}

class SegtreeNode
{
public:
    int lran,rran,tag_add,val;
    SegtreeNode *left,*right;

    SegtreeNode(int l,int r):lran(l),rran(r)
    {
        val=0;
        for(int i=l;i<=r;i++) val+=a[i];
        tag_add=0;
        left=nullptr;
        right=nullptr;
    }
    ~SegtreeNode()
    {
        left=nullptr;
        right=nullptr;
    }
};

class Segtree
{
public:
    SegtreeNode *root;

    Segtree(int l,int r)
    {
        root=new SegtreeNode(l,r);
    }
    ~Segtree()
    {
        delete root;
    }
    void update(SegtreeNode* &node)
    {
        if(node->tag_add==0) return;
        int mid=(node->lran + node->rran)/2;
        if(node->left!=nullptr)
        {
            node->left->tag_add += node->tag_add;
            node->left->val += node->tag_add*(mid - node->lran + 1);
        }
        if(node->right!=nullptr)
        {
            node->right->tag_add += node->tag_add;
            node->right->val += node->tag_add*(node->rran - mid);
        }
        node->tag_add=0;
    }
    void add(SegtreeNode* &node,int x,int y,int k)
    {
        if(x==node->lran && y==node->rran)
        {
            node->tag_add += k;
            node->val += node->tag_add*(node->rran - node->lran + 1);
            return;
        }
        int mid=(node->lran + node->rran)/2;
        if(y<=mid)
        {
            if(node->left==nullptr) node->left=new SegtreeNode(node->lran,mid);
            add(node->left,x,y,k);
        }
        else if(x>=mid+1)
        {
            if(node->right==nullptr) node->right=new SegtreeNode(mid+1,node->rran);
            add(node->right,x,y,k);
        }
        else
        {
            if(node->left==nullptr) node->left=new SegtreeNode(node->lran,mid);
            add(node->left,x,mid,k);
            if(node->right==nullptr) node->right=new SegtreeNode(mid+1,node->rran);
            add(node->right,mid+1,y,k);
        }

        node->val = node->left->val + node->right->val;
    }
    int sum(SegtreeNode* &node,int x,int y)
    {
        update(node);
        if(node->lran==x && node->rran==y) return node->val;
        int mid=(node->lran + node->rran)/2;
        if(node->left==nullptr) node->left=new SegtreeNode(node->lran,mid);
        if(node->right==nullptr) node->right=new SegtreeNode(mid+1,node->rran);
        if(y<=mid) return sum(node->left,x,y);
        if(x>=mid+1) return sum(node->right,x,y);
        return sum(node->left,x,mid)+sum(node->right,mid+1,y);
    }
};

void _main(Segtree& STree)
{
    int op,x,y,k;
    for(int i=1;i<=m;i++)
    {
        cin>>op;
        if(op==1)
        {
            cin>>x>>y>>k;
            STree.add(STree.root,x,y,k);
        }
        else if(op==2)
        {
            cin>>x>>y;
            cout<<STree.sum(STree.root,x,y)<<endl;
        }
    }
}

int main()
{
    init();
    Segtree STree(1,n);
    _main(STree);
    deconstruct();
    return 0;
}
2024/9/7 22:56
加载中...