救救孩子,爆零求助!
查看原帖
救救孩子,爆零求助!
654414
Ultimate_er楼主2022/7/23 17:02

不知道为什么,数据前几个都能过,都是后面的报错。调试无果,特来求助.

#include<iostream>
using namespace std;

const int maxn = 1e5+10;
int n, m, q, input[maxn];


struct Node{
    int l, r, sum, lazy;
    Node *lson, *rson;
    Node(){
        l=r=sum=0;
        lson=rson=NULL;
    }
};

Node * root = new Node;

void update(Node *node){
    node->sum=0;    //非常重要
    if (node->lson) node->sum+=node->lson->sum;
    if (node->rson) node->sum+=node->rson->sum;
}

//建树
void build(Node *node, int l, int r){
    node->l=l,node->r=r;
    
    if (l==r){
        node->sum=input[l];
        return;
    }
    else {
        int mid=l+(r-l)/2;
        
        node->lson=new Node;
        node->rson=new Node;

        build(node->lson, l, mid);
        build(node->rson, mid+1, r);

        update(node);
    }
}


// 向下传参
void setDown(Node *node){
    int l=node->l,r=node->r, lazy=node->lazy;
    if (l==r){
        node->sum+=lazy;
    }else{
        Node *l_nd=node->lson, *r_nd=node->rson;

        //左
        if (l_nd){
            setDown(l_nd);
            node->sum+=lazy;
        }
        //右
        if (r_nd){
            setDown(r_nd);
            node->sum+=lazy;
            r_nd->lazy=0;
        }

        update(node);
    }
}


//区间修改
void changeSegment(Node *node, int l, int r, int k){
    int l_=node->l, r_=node->r;
    //修改
    if (l_==l&&r_==r){
        node->lazy+=k;
        setDown(node);
    }else {
        Node *l_nd=node->lson, *r_nd=node->rson;
        
        int mid = l_+(r_-l_)/2;
        if (r<=mid){
            changeSegment(l_nd, l, r, k);
        }else if (mid<l){
            changeSegment(r_nd, l, r, k);
        }else {
            changeSegment(l_nd, l, mid, k);
            changeSegment(r_nd, mid+1, r, k);
        }
        update(node);
    }
}


//区间 ?和:
int find_segment(int l, int r, Node *node){
    int l_=node->l, r_=node->r;
    if (l_==l&&r_==r) return node->sum;
    else {
        int mid=l_+(r_-l_)/2;
        if(r<=mid){
            return find_segment(l, r, node->lson);
        }else if(mid<l){
            return find_segment(l, r, node->rson);
        }else {
            return find_segment(l,mid, node->lson)+find_segment(mid+1, r, node->rson);
        }
    }
}

int main(){
    cin >> n >> q;
    for (int i=0; i<n; i++){
        cin >> input[i];
    }

    //建树
    build(root, 0, n-1);

    //Conqulate:
    int in, l, r, k;
    for (int i=0; i<q; i++){
        cin>>in >> l >> r;
        l--, r--;
        if (in==1){
            cin >> k;
            changeSegment(root, l, r, k);
        }else {
            int num = find_segment(l, r, root);
            cout << num << endl;
        }
    }
    return 0;
}
2022/7/23 17:02
加载中...