线段树过了样例但提交只有20分,求调

P3372 【模板】线段树 1

膜拜陈桉大佬 @ 2022-11-21 19:41:50

谢谢!

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
#define ll long long 
using namespace std;
ll n,m;
ll a[100020];
struct node{
    ll l,r,lz,mx;
}tree[400020];
void build (int k,int l,int r){
    tree[k].l=l;
    tree[k].r=r;
    tree[k].lz=0;
    tree[k].mx=0;
    if(l==r){
        tree[k].mx=a[l];
        return;
    }
    int mid,lc,rc;
    lc=2*k;
    rc=2*k+1;
    mid=l+(r-l)/2;
    build(lc,l,mid);
    build(rc,mid+1,r);
    tree[k].mx=tree[lc].mx+tree[rc].mx;
}
void lazy(int k,int v){
    tree[k].mx+=v*(tree[k].r-tree[k].l+1);
    tree[k].lz+=v;
}
void pushdown(int k){
    int mid,lc,rc;
    lc=2*k;
    rc=2*k+1;
    mid=(tree[k].l+tree[k].r)/2;
    tree[lc].mx=tree[lc].mx+tree[k].lz*(mid-tree[k].l+1);
    tree[lc].lz=tree[k].lz;
    tree[rc].mx=tree[rc].mx+tree[k].lz*(tree[k].r-mid);
    tree[rc].lz=tree[k].lz;
    tree[k].lz=0;
}
void update(int k,int l,int r,int v){
    if(tree[k].l>=l&&tree[k].r<=r){
        lazy(k,v);return;
    }
    if(tree[k].lz!=0)pushdown(k);
    int mid,lc,rc;
    lc=2*k;
    rc=2*k+1;
    mid=(tree[k].l+tree[k].r)/2;
    if(tree[lc].r>=l)update(lc,l,r,v);
    if(tree[rc].l<=r)update(rc,l,r,v);
    tree[k].mx=tree[lc].mx+tree[rc].mx;

}
int query(int k,int l,int r){
    ll sum=0;
    if(tree[k].l>=l&&tree[k].r<=r){
        sum+=tree[k].mx;
        return tree[k].mx;
    }
    if(tree[k].lz!=0)pushdown(k);
    int mid,lc,rc;
    lc=2*k;
    rc=2*k+1;
    mid=(tree[k].l+tree[k].r)/2;

    if(tree[lc].r>=l)sum+=query(lc,l,r);
    if(tree[rc].l<=r)sum+=query(rc,l,r);
    return sum;
}
int main(){
    int f,x,y,k;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){

        cin>>f;
        if(f==1){
            cin>>x>>y>>k;
            update(1,x,y,k);
        }
        else if(f==2){
            cin>>x>>y;
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;
}

by 8atemak1r @ 2022-11-21 19:59:19

@膜拜陈桉大佬 pushdown 里应为 tree[lc].lz+=tree[k].lz;tree[rc].lz+=tree[k].lz;


by 膜拜陈桉大佬 @ 2022-11-21 20:08:37

@8atemak1r 改完后提交是70分,不知道是哪里还有问题


by 膜拜陈桉大佬 @ 2022-11-21 20:33:30

@8atemak1r 解决了,就是开long long的问题(开了但没完全开


|