10分求调

P3372 【模板】线段树 1

gyc071116 @ 2024-08-01 21:50:31

除了#1全WA,样例能过

#include<bits/stdc++.h>
#define ls (x<<1)
#define rs ((x<<1)|1)
#define int long long
using namespace std;
struct node{
    int l;
    int r;
    int sum;
}tree[400005];
int a[100005],tag[400005];
void build_tree(int x,int l,int r){
    if(l==r){
        tree[x]=(node){l,l,a[l]};
        return; 
    }
    int mid=(l+r)>>1;
    build_tree(ls,l,mid);
    build_tree(rs,mid+1,r);
    tree[x]=(node){l,r,tree[ls].sum+tree[rs].sum};
    return;
}
void down(int x){
    if(tag[x]){
        tree[ls].sum=tree[ls].sum+(tree[ls].r-tree[ls].l+1)*tag[x];
        tree[rs].sum=tree[rs].sum+(tree[rs].r-tree[rs].l+1)*tag[x];
        tag[ls]+=tag[x];
        tag[rs]+=tag[x];
        tag[x]=0;
    }
}
void update(int x){
    tree[x].sum=tree[rs].sum+tree[ls].sum;
}
int search(int x,int l,int r){
    if(tree[x].l>=l&&tree[x].r<=r){
        return tree[x].sum;
    }
    if(tree[x].l>r||tree[x].r<l) return 0;
    down(x);
    return search(ls,l,r)+search(rs,l,r);
}
void add(int x,int l,int r,int k){
    if(tree[x].l>=l&&tree[x].r<=r){
        tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
        tag[x]+=k;
        return;
    }
    if(tree[x].l>r||tree[x].r<l) return;
    add(ls,l,r,k);
    add(rs,l,r,k);
    update(x);
}
signed main(){
    int n,m;
    scanf("%lld %lld",&n,&m);
    for(int i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build_tree(1,1,n);
    for(int i=1;i<=m;i++){
        int op;
        scanf("%lld",&op);
        if(op==1){
            int xx,yy,k;
            scanf("%lld %lld %lld",&xx,&yy,&k);
            add(1,xx,yy,k);
        }
        if(op==2){
            int xxx,yyy;
            scanf("%lld %lld",&xxx,&yyy);
            printf("%lld\n",search(1,xxx,yyy));
        }
    }
    return 0;
}

by sutiancheng @ 2024-08-01 22:00:59

add函数内要down(x)

void add(int x,int l,int r,int k){
    if(tree[x].l>=l&&tree[x].r<=r){
        tree[x].sum+=(tree[x].r-tree[x].l+1)*k;
        tag[x]+=k;
        return;
    }
    if(tree[x].l>r||tree[x].r<l) return;
    down(x);
    add(ls,l,r,k);
    add(rs,l,r,k);
    update(x);
}

by gyc071116 @ 2024-08-02 06:46:22

@sutiancheng 谢谢大佬


by piano_pei @ 2024-08-03 00:06:21

你没开long long,数据给的因该是会爆int


|