RE 0pts求助

P3372 【模板】线段树 1

The_Wandering_Earth @ 2023-01-07 21:42:26

#include<bits/stdc++.h>
#define lid (id*2)
#define rid (id*2+1)
#define int long long
using namespace std;
const int maxn=100005;
int n,a[maxn],op,q;
struct seg_tree{int l,r,sum,lazy;}tr[maxn*4];
void build(int id,int l,int r){
    tr[id].l=l,tr[id].r=r;
    if(l==r)tr[id].sum=a[l];
    else{
        int mid=(l+r)/2;
        build(lid,l,mid);
        build(rid,mid+1,r);
        tr[id].sum=tr[lid].sum+tr[rid].sum;
    }
} 
void pushdown(int id){
    if(tr[id].l!=tr[id].r&&tr[id].lazy!=0){
        tr[lid].lazy+=tr[id].lazy;
        tr[rid].lazy+=tr[id].lazy;
        tr[lid].sum+=tr[id].lazy*(tr[lid].r-tr[lid].l+1);
        tr[rid].sum+=tr[id].lazy*(tr[rid].r-tr[rid].l+1);
        tr[id].lazy=0;
    }
}
void add(int id,int l,int r,int k){
    pushdown(id);
    if(tr[id].l==tr[id].r){
        tr[id].sum+=(tr[id].r-tr[id].l+1)*k,tr[id].lazy+=k;
        return;
    }
    int mid=(tr[id].l+tr[id].r)/2;
    if(r<=mid)add(lid,l,r,k);   
    else if(l>mid)add(rid,l,r,k);
    else {
        add(lid,l,mid,k);
        add(rid,mid+1,r,k);
    }
    tr[id].sum=tr[lid].sum+tr[rid].sum;
}
int query(int id,int l,int r){
    pushdown(id);
    if(tr[id].l==l&&tr[id].r==r)return tr[id].sum;
    int mid=(tr[id].l+tr[id].r)>>1;
    if(r<=mid)return query(lid,l,r);
    if(l>mid)return query(rid,l,r);
    return query(lid,l,mid)+query(rid,mid+1,r);
}
signed main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++)scanf("%d",&a[i]);
    build(1,1,n);
    while(q--){
        cin>>op;
        if(op==1){
            int x,y,k;
            scanf("%d%d%d",&x,&y,&k);
            add(1,x,y,k);
        }
        if(op==2){
            int left,right;
            scanf("%d%d",&left,&right);
            printf("%d\n",query(1,left,right));
        }
    }
}

by ISTP @ 2023-01-07 21:47:38

@zhangpeinan123 define int long long 了,scanf 里的也得改成 %lld 吧


by OldDriverTree @ 2023-01-07 21:50:05

@zhangpeinan123

  1. add和query函数中,pushdown函数放第一个if的后面
  2. add和query函数的第一个判断条件改成l<=tr[id].l&&tr[id].r<=r

by The_Wandering_Earth @ 2023-01-07 21:56:01

@guoxiangyu66 第二条不太理解,为什么包括这部分就要给整个大的区间增加k呢


by 樱雪喵 @ 2023-01-07 22:42:58

@zhangpeinan123 别听他瞎说。改成 if(tr[id].l==l&&tr[id].r==r)


by Aigony @ 2023-01-07 22:44:14

@guoxiangyu66 az,怎么又冒出来个不懂瞎说的(


by Aigony @ 2023-01-07 22:45:44

注意看他下面是分了三部分讨论,而且第三部分传参传的是mid而不是l和r啊喂。

是不是 lz 每发一个帖我都得来解释一遍/qd


by Aigony @ 2023-01-07 22:48:17

帮您交了一下,30 行按我说的改一下,%d 改成 %lld 就 AC 了。


by Aigony @ 2023-01-07 22:50:16

以后你线段树相关问题可以直接私信我大号,别发帖然后引来一群人说线段树判断条件不对((


by The_Wandering_Earth @ 2023-01-08 09:10:30

@樱雪喵 @Aigony 感谢,已AC,此帖结


|