调了两小时样例还没过,,求大佬看看
查看原帖
调了两小时样例还没过,,求大佬看看
461671
LumenOvO楼主2021/11/13 00:12
#include <bits/stdc++.h>
using namespace std;
#define int ll
#define ll long long
#define endl '\n'
const double PI = acos(-1.0);
typedef pair<int,int> PII;
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int modn = 998244353;
const int N = 1e5+5;
struct node{
    int lazy;
    int sum;
}segt[N*4];
int a[N];
void pushup(int rt){
    segt[rt].sum=segt[rt*2].sum+segt[rt*2+1].sum;
}
void build(int l,int r,int rt){
    if(l==r){
        segt[rt].sum=a[l];
        return;
    }
    int mid = (l+r)/2;
    build(l,mid,rt*2);
    build(mid+1,r,rt*2+1);
    //segt[rt].sum=segt[rt<<1].sum+segt[(rt<<1)+1].sum;
    pushup(rt);
}
void pushdown(int ln,int rn,int rt){
    if(segt[rt].lazy){
        segt[rt*2].lazy+=segt[rt].lazy;
        segt[rt*2+1].lazy+=segt[rt].lazy;
        segt[rt*2].sum+=ln*segt[rt].lazy;
        segt[rt*2+1].sum+=rn*segt[rt].lazy;
        segt[rt].lazy=0;
    }
}
void update(int l,int r,int nl,int nr,int rt,int x){
    if(nl>=l&&nr<=r){
        segt[rt].sum+=(nr-nl+1)*x;
        segt[rt].lazy+=x;
        return;
    }
    int mid = (nl+nr)/2;
    pushdown(mid-l+1,r-mid,rt);
    if(l<=mid) update(l,r,nl,mid,rt*2,x);
    if(r>mid) update(l,r,mid+1,nr,rt*2+1,x);
    pushup(rt);
}
int getsum(int l,int r,int nl,int nr,int rt){
    if(nl>=l&&nr<=r){
        return segt[rt].sum;
    }
    if(l>nr||r<nl) return 0;
    int mid = (nl+nr)/2;
    pushdown(mid-l+1,r-mid,rt);
    int sum=0;
    if(l<=mid) sum+=getsum(l,r,nl,mid,rt*2);
    if(r>mid) sum+=getsum(l,r,mid+1,nr,rt*2+1);
    return sum;
}
void solve(){
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,n,1);
    while(m--){
        int b,x,y,k;
        cin>>b;
        if(b==1){
            cin>>x>>y>>k;
            update(x,y,1,n,1,k);
        }else{
            cin>>x>>y;
            cout<<getsum(x,y,1,n,1)<<endl;
        }
    }
}
signed main(){
    ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    int _=1;
    //cin>>_;
    //getchar();
    while(_--){
        solve();
    }
    return 0;
}
2021/11/13 00:12
加载中...