求助,样例都不过,找不出错误。。。
查看原帖
求助,样例都不过,找不出错误。。。
540148
Universal_xtr楼主2021/10/3 11:35

如题,代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
ll n,m;
ll a[1000001];
ll s[4000004],laji[4000004];
void build(ll p,ll l,ll r){
    if(l==r){s[p]=a[l];return;}
    ll mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    s[p]=s[p<<1]+s[p<<1|1];
}
ll querysum(ll p,ll ql,ll qr,ll l,ll r){
    if(ql<=l and qr>=r)return s[p];
    ll mid=(l+r)>>1;
    if(laji[p]){
        s[p<<1]+=(mid-l+1)*laji[p];laji[p<<1]=laji[p<<1|1]=laji[p];
        s[p<<1|1]+=(r-mid)*laji[p];laji[p]=0;
    }
    ll sum=0;
    if(ql<=mid)sum+=querysum(p<<1,ql,qr,l,mid);
    if(qr>mid)sum+=querysum(p<<1|1,ql,qr,mid+1,r);
    return sum;
}
void update(ll p,ll ql,ll qr,ll k,ll l,ll r){
    if(ql<=l and qr>=r){laji[p]+=k;s[p]=(r-l+1)*k;return;}
    ll mid=(l+r)>>1;
    if(laji[p]){
        s[p<<1]+=(mid-l+1)*laji[p];laji[p<<1]=laji[p<<1|1]=laji[p];
        s[p<<1|1]+=(r-mid)*laji[p];laji[p]=0;
    }
    if(ql<=mid)update(p<<1,ql,qr,k,l,mid);
    if(qr>mid)update(p<<1|1,ql,qr,k,mid+1,r);
    s[p]=s[p<<1]+s[p<<1|1];
}
int main(){
    cin>>n>>m;
    for(ll i=1;i<=n;i++)cin>>a[i];
    build(1,1,n);
    while(m--){
        ll op;cin>>op;
        if(op==2){
            ll x,y;cin>>x>>y;
            cout<<querysum(1,x,y,1,n)<<endl;
        }
        if(op==1){
            ll x,y,z;cin>>x>>y>>z;
            update(1,x,y,z,1,n);
        }
    }
    return 0;
}

感谢各位大佬

2021/10/3 11:35
加载中...