WA了,求调!

P3372 【模板】线段树 1

bianyanze @ 2024-09-18 22:26:15

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int data[N];
struct segtree{
    int l,r,lazy,sum;
}a[N<<2];
void pushup(int u){
    a[u].sum=a[u<<1].sum+a[u<<1|1].sum;
}
void build(int u,int l,int r){
    a[u].l=l;
    a[u].r=r;
    if(l==r){
        a[u].sum=data[l];
        return;
    }
    int mid=l+r>>1;
    build(u<<1,l,mid);
    build(u<<1|1,mid+1,r);
    pushup(u);
}
void pushdown(int u){
    if(a[u].lazy){
        a[u<<1].sum+=a[u].lazy*(a[u<<1].r-a[u<<1].l+1);
        a[u<<1|1].sum+=a[u].lazy*(a[u<<1|1].r-a[u<<1|1].l+1);
        a[u<<1].lazy+=a[u].lazy;
        a[u<<1|1].lazy+=a[u].lazy;
        a[u].lazy=0;
    }
}
void update(int l,int r,int k,int u){
    if(l<=a[u].l&&r>=a[u].r){
        a[u].sum+=k*(r-l+1);
        a[u].lazy+=k;
        return;
    }
    pushdown(u);
    int mid=a[u].l+a[u].r>>1;
    if(l<=mid)update(l,r,k,u<<1);
    if(r>mid)update(l,r,k,u<<1|1);
    pushup(u);
}
long long query(int u,int l,int r){
    if(l<=a[u].l&&r>=a[u].r)return a[u].sum;
    pushdown(u);
    long long ans=0;
    int mid=a[u].l+a[u].r>>1;
    if(l<=mid)ans+=query(u<<1,l,r);
    if(r>mid)ans+=query(u<<1|1,l,r);
    return ans;
}
inline int read(){
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')x=(x<<1)+(x<<3)+(ch&15),ch=getchar();
    return x*f;
}
int n,m;
int op,x,y,z;
int main(){

    n=read(),m=read();
    for(int i=1;i<=n;i++){
        data[i]=read();
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        op=read();
        if(op==1){
            x=read(),y=read(),z=read();
            update(x,y,z,1);
        }else{
            x=read(),y=read();
            cout<<query(1,x,y)<<endl;
        }
    }
    return 0;
}

by wild_asriel_X @ 2024-09-20 09:37:10

@bianyanze 你的 update 里的 a[u].sum+=k*(r-l+1)可能要改成a[u].sum+=k*(a[u].r-a[u].l+1)


by wild_asriel_X @ 2024-09-20 09:38:08

@bianyanze 而且 data 好像是系统关键字。以及这题还要开 long long。


by bianyanze @ 2024-09-20 21:53:24

@chaotic_ data好像不是系统关键字(主要是没加粗) 谢谢你的解答 再问个问题:update开long long吗 thanks


by wild_asriel_X @ 2024-09-21 10:30:45

@bianyanze 正常来说是要开的,但是我改你代码时没开也过了。最好也开一下,但是 segtree 里的 sum 是一定要开 long long 的。


|