#10分求助
查看原帖
#10分求助
420063
ARTL楼主2021/2/6 16:42
#include <bits/stdc++.h>
#define maxn 100005
using namespace std;
int a[maxn];
struct node{
    long long sum;
    long long lazy=0;
};
node tree[4*maxn];

void build(int l,int r,int now)
{
    if(l==r){
        tree[now].sum=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,now*2);
    build(mid+1,r,now*2+1);
    tree[now].sum=tree[2*now].sum+tree[2*now+1].sum;
}

void update(int L,int R,int l,int r,int now,int k)
{
    if(L==l&&R==r){
        tree[now].sum+=k*(r-l+1);
        tree[now*2].lazy+=k;
        tree[now*2+1].lazy+=k;
        return;
    }
    int mid=(l+r)/2;
    if(L>mid)
        update(L,R,mid+1,r,now*2+1,k);
    else if(R<=mid)
        update(L,R,l,mid,now*2,k);
    else{
        update(L,mid,l,mid,now*2,k);
        update(mid+1,R,mid+1,r,now*2+1,k);
    }
    tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
}

int query(int L,int R,int l,int r,int now)
{
    if(tree[now].lazy!=0){
            tree[now].sum+=tree[now].lazy*(r-l+1);
            tree[now*2].lazy+=tree[now].lazy;
            tree[now*2+1].lazy+=tree[now].lazy;
            tree[now].lazy=0;
        }
    if(L==l&&R==r)
            return tree[now].sum;
    int mid=(l+r)/2;
    if(R<=mid)
        query(L,R,l,mid,now*2);
    else if(L>mid)
        query(L,R,mid+1,r,now*2+1);
    else{
        int a,b;
        a=query(L,mid,l,mid,now*2);
        b=query(mid+1,R,mid+1,r,now*2+1);
        return a+b;
    }

}

int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,n,1);
    int cz,x,y,k,Sum;
    for(int i=0;i<m;i++){
         scanf("%d",&cz);
        if(cz==1){
            scanf("%d%d%d",&x,&y,&k);
            update(x,y,1,n,1,k);
        }
        else{
            scanf("%d%d",&x,&y);
            Sum=query(x,y,1,n,1);
            printf("%d\n",Sum);
        }
    }
    return 0;
}

}

测试样例全过,但是提交上去只有第一组数据过了,最后三组数据还超时。。。 个人猜想:wa是不是因为我懒标签下滤早了?超时。。。暂时没有想到原因。 求大佬帮助,万分感谢[鞠躬]!

2021/2/6 16:42
加载中...