无法通过样例,求助!!!
查看原帖
无法通过样例,求助!!!
909957
LITFLYR楼主2024/7/20 20:55
#include<bits/stdc++.h>
using namespace std;
#define ls(x) (x<<1)
#define rs(x) (x<<1|1)
#define int long long
int n,m,a[100005],x,y,k,b;
int t[400005],lazy_tag[400005];
void push_back(int f){
    t[f]=t[ls(f)]+t[rs(f)];
}
void push_down(int f,int x,int y){
    int mid=(x+y)>>1;
    lazy_tag[ls(f)]=lazy_tag[ls(f)]+lazy_tag[f];
    lazy_tag[rs(f)]=lazy_tag[rs(f)]+lazy_tag[f];
    t[ls(f)]+=lazy_tag[ls(f)]*(mid-x+1);
    t[rs(f)]+=lazy_tag[rs(f)]*(y-mid);
    lazy_tag[f]=0;
}
void build(int f,int l,int r){
    lazy_tag[f]=0;
    if(l==r){t[f]=a[l];return ;}
    int mid=(l+r)>>1;
    build(ls(f),l,mid);
    build(rs(f),mid+1,r);
    push_back(f);
}
void pus(int f,int l,int r,int x,int y,int k){
    if(x<=l&&y>=r){lazy_tag[f]+=k;t[f]+=(r-l+1)*k;return ;}
    push_down(f,l,r);
    int mid=(l+r)>>1;
    if(x<=mid) pus(ls(f),l,mid,x,y,k);
    if(y>mid) pus(rs(f),mid+1,r,x,y,k);
    push_back(f);
}
int query(int f,int l,int r,int x,int y){
    if(x<=l&&y>=r){return t[f];}
    int mid=(l+r)>>1;int ans=0;
    push_down(f,l,r); 
    if(x<=mid) ans+=query(ls(f),l,mid,x,y);
    if(y>mid) ans+=query(rs(f),mid+1,r,x,y);
    return ans;
}
signed main(){
    cin >> n >> m;
    for(int i=1;i<=n;i++){
        cin >> a[i];
    }
    build(1,1,n);
    while(m--){
        cin >> b;
        if(b==1){
            cin >> x >> y >> k;
            pus(1,1,n,x,y,k);
        }
        else if(b==2){
            cin >> x >> y;
            int ans=query(1,1,n,x,y);
            cout << ans << endl;
        }
    }
    return 0;
}
2024/7/20 20:55
加载中...