0分全WA求调
查看原帖
0分全WA求调
943498
wangshenluogu楼主2025/2/5 11:27

代码:

#include<bits/stdc++.h>
using namespace std;
const int maxn=5e5+10;
long long n,m,a[maxn],sum[maxn*4],add[maxn*4],op,x,y,k;
void pushdown(int ln,int rn,int o){//ln=左子树节点数,rn=右子树结点数
    if(add[o]!=0){
    	add[o*2]+=add[o];
    	add[o*2+1]+=add[o];
    	sum[o*2]+=add[o]*ln;
    	sum[o*2+1]+=add[o]*rn;
    	add[o]=0;
	}
	return;
}
void build(int l,int r,int o){
	if(l==r){
		sum[o]=a[l];//sum[o]=a[r];
        return;
	}
	int mid=(l+r)/2;
	build(l,mid,o*2);
	build(mid+1,r,o*2+1);
	sum[o]=sum[o*2]+sum[o*2+1];
	return;
}
void update(int l,int r,int o){
	if(x<=l&&y>=r){
		return;
	}
	int mid=(l+r)/2;
	pushdown(mid-l+1,r-mid,o);
	if(x<=mid){
		update(l,mid,o*2);
	}
	if(y>mid){
		update(mid+1,r,o*2+1);
	}
	sum[o]=sum[o*2]+sum[o*2+1];
	return;
}
long long query(int l,int r,int o){
	if(x<=l&&y>=r){
		return sum[o];
	}
	int mid=(l+r)/2;
	long long zc=0;
	pushdown(mid-l+1,r-mid,o);
	if(x<=mid){
		zc+=query(l,mid,o*2);
	}
	if(y>mid){
		zc+=query(mid+1,r,o*2+1);
	}
	return zc;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,n,1);
	for(int i=1;i<=m;i++){
		cin>>op;
		if(op==1){
			cin>>x>>y>>k;
			update(1,n,1);
		}else if(op==2){
			cin>>x>>y;
			cout<<query(1,n,1)<<endl;
		}
	}
	return 0;
}

样例未过。

本帖禁止无意义回复,请提供有效帮助。

2025/2/5 11:27
加载中...