MnZn代码70pts求调
查看原帖
MnZn代码70pts求调
564427
SiXinchen楼主2023/8/5 20:17
#include<bits/stdc++.h>
using namespace std;

long long a[10005];

struct tree{
    long long l,r,sc,la;
}t[450005];

void build(long long p,long long l,long long r){
    t[p].l=l,t[p].r=r;
    if(l==r){
        t[p].sc=a[l];
        return;
    }
    build(p*2,l,(l+r)>>1);
    build(p*2+1,((l+r)>>1)+1,r);
    t[p].sc=t[p*2].sc+t[p*2+1].sc;
}

void spread(long long p){
    if(t[p].la){
        t[p*2].sc+=t[p].la*(t[p*2].r-t[p*2].l+1);
        t[p*2+1].sc+=t[p].la*(t[p*2+1].r-t[p*2+1].l+1);
        t[p*2].la+=t[p].la;
        t[p*2+1].la+=t[p].la;
        t[p].la=0;
    }
}

void change(long long p,long long l,long long r,long long k){
    if(l<=t[p].l&&t[p].r<=r){
        t[p].sc+=k*(t[p].r-t[p].l+1);
        t[p].la+=k;
        return;
    }
    spread(p);
    if(l<=((t[p].l+t[p].r)>>1))change(p*2,l,r,k);
    if(r>((t[p].l+t[p].r)>>1))change(p*2+1,l,r,k);
    t[p].sc=t[p*2].sc+t[p*2+1].sc;
}

long long print(long long p,long long l,long long r){
    if(l<=t[p].l&&t[p].r<=r)return t[p].sc;
    spread(p);
    long long ans=0;
    if(l<=((t[p].l+t[p].r)>>1))ans+=print(p*2,l,r);
    if(r>((t[p].l+t[p].r)>>1))ans+=print(p*2+1,l,r);
    return ans;
}

int main(){
    long long m,n;
    scanf("%lld %lld",&n,&m);
    for(long long i=1;i<=n;i++){
        scanf("%lld",&a[i]);
    }
    build(1,1,n);
    for(long long i=1;i<=m;i++){
        long long xx;
        scanf("%lld",&xx);
        if(xx==1){
            long long x,y,z;
            scanf("%lld %lld %lld",&x,&y,&z);
            change(1,x,y,z);
        }
        else{
            long long x,y;
            scanf("%lld %lld",&x,&y);
            printf("%lld\n",print(1,x,y));
        }
    }
    return 0;
}

看着题解现学,历经九九八十一难结果发现最后三个点WA了 /ng

2023/8/5 20:17
加载中...