初学求助QAQ 只有10分
查看原帖
初学求助QAQ 只有10分
415949
Auuuu楼主2021/7/4 14:52
using namespace std;
long long n,a[10000],l,r,m,x,y,k,choose,result[10000],tt=0;
struct tree{
    int lt,rt,sum,l,r;
    long long lazy;
}c[40000];
void build(int root,int lt,int rt){
    c[root].sum=0;
    c[root].lt=lt; c[root].rt=rt;
    for(int i=lt;i<=rt;i++) c[root].sum+=a[i];
    if(lt==rt) return;
    int mid=(lt+rt)/2;
    build(root*2,lt,mid); build(root*2+1,mid+1,rt);
}
void lazy(int x){
    c[x*2].sum+=(c[x*2].rt-c[x*2].lt+1)*c[x].lazy;
    c[x*2].lazy=c[x].lazy;
    c[x*2+1].sum+=(c[x*2+1].rt-c[x*2+1].lt+1)*c[x].lazy;
    c[x*2+1].lazy=c[x].lazy;
    c[x].lazy=0;
}
long long search(int root,int ll,int rr){
    if(c[root].lt==ll&&c[root].rt==rr) return c[root].sum;
    int midd=(c[root].lt+c[root].rt)/2;
    if(c[root].lazy!=0) lazy(root);
    if(ll>midd) return search(root*2+1,ll,rr);
    if(rr<=midd) return search(root*2,ll,rr);
    return search(root*2,ll,midd)+search(root*2+1,midd+1,rr); 
}
void update(int root,int xx,int yy,int date){
    c[root].sum+=(yy-xx+1)*date;
    if(c[root].lt==xx&&c[root].rt==yy){ c[root].lazy=date;return;
    } 
    int mid=(c[root].lt+c[root].rt)/2;
    if(xx>mid){update(root*2+1,xx,yy,date);return;} 
    if(yy<=mid) {update(root*2,xx,yy,date);return;}
    update(root*2+1,mid+1,yy,date); update(root*2,xx,mid,date);
}

int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    //for(int i=1;i<=z;i++) cout<<c[i].lt<<c[i].rt<<endl;
    for(int i=1;i<=m;i++){
        cin>>choose;
        if(choose==1){
            cin>>x>>y>>k;
            update(1,x,y,k);
        }
        if(choose==2){
            cin>>x>>y;
            tt+=1;
            result[tt]=search(1,x,y);
        }
    }
    for(int q=1;q<=tt;q++){
        cout<<result[q];
        if(q!=tt) cout<<endl;
    
    } 
    return 0;
} 
(是这样发帖吗QAQ)
2021/7/4 14:52
加载中...