最后三个WA了,求调

P3372 【模板】线段树 1

lansuren @ 2023-04-12 01:22:51

#include <bits/stdc++.h>
using namespace std;
#define lc k<<1
#define rc k<<1|1
#define ll long long

const int maxn=100005;
ll n,m;
ll p,q,r,s,a[maxn+2];

struct node{
    ll l,r,sum,lazy;
}tree[maxn*4+2];

void pushup(ll k){
    tree[k].sum=tree[lc].sum+tree[rc].sum;
}

void build_tree(ll k,ll l,ll r){
    tree[k].l=l;
    tree[k].r=r;
    if(l==r){
        tree[k].sum=a[l];
        return;
    }
    ll mid=(l+r)>>1;
    build_tree(lc,l,mid);
    build_tree(rc,mid+1,r);
    pushup(k);
}

void pushdown(ll k){
    if (tree[k].lazy){
        tree[lc].lazy+=tree[k].lazy;
        tree[lc].sum+=(tree[lc].r-tree[lc].l+1)*tree[k].lazy;
        tree[rc].lazy+=tree[k].lazy;
        tree[rc].sum+=(tree[rc].r-tree[rc].l+1)*tree[k].lazy;
        tree[k].lazy=0;
    }
}

void modify(ll k,ll l,ll r,ll s){
    if(tree[k].l>=l && tree[k].r<=r){
        tree[k].lazy+=s;
        tree[k].sum+=(tree[k].r-tree[k].l+1)*s;
        return;
    }
    pushdown(k);
    ll mid=(tree[k].l+tree[k].r)>>1;
    if(l<=mid) modify(lc,l,r,s);
    if(r>mid) modify(rc,l,r,s);
    pushup(k);
}

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

int main(){
    cin>>n>>m;
    for(ll i=1;i<=n;i++){
        cin>>a[i];
    }
    build_tree(1,1,n);
    for(ll i=1;i<=m;i++){
        cin>>p;
        if(p==1){
            cin>>q>>r>>s;
            modify(1,q,r,s);
        }
        else{
            cin>>q>>r;
            cout<<query(1,q,r)<<endl;
        }
    }
    return 0;
}

by yizhiming @ 2023-04-12 06:39:34

@lansuren query返回值改成 long long 就好了


by lansuren @ 2023-04-12 09:06:16

@yizhiming 大佬起的好早,感谢!


|