0分求调
查看原帖
0分求调
990478
CPlusPlus_xiang楼主2024/10/22 18:52

跟着老师写了一遍但是发现我的答案对不上,问了AI他也找不到,求各位大佬帮帮我!十分感谢!!

#include<bits/stdc++.h>
using namespace std;

int n,m,in[400100],ans[400100];
int lazy[400100];

void build(int noww,int lt,int rt){
	lazy[noww] = 0;
	if(lt == rt){
		ans[lt] = in[lt];
		return;
	}
	int mid = (lt + rt) >> 1;
	build(noww * 2,lt,mid);
	build(noww * 2 + 1,mid + 1,rt);
	ans[noww] = ans[noww * 2] + ans[noww * 2 + 1];
}

void makelazy(int noww,int l,int r,int addnum){
	lazy[noww] += addnum;
	ans[noww] = ans[noww] + (r - l + 1) * addnum;
}

void newlazy(int noww,int l,int r){
	int mid = (l + r) >> 1;
	makelazy(noww * 2,l,mid,lazy[noww]);
	makelazy(noww * 2 + 1,mid + 1,r,lazy[noww]);
	lazy[noww] = 0;
}

void addnumber(int adl,int adr,int noww,int l,int r,int addnum){
	//adl为增加数的区间的左端点,adr为增加数的区间的右端点
	//l,r分别为当前操作的区间的左右端点 
	if(adl <= l && r <= adr){
		lazy[noww] += addnum;
		ans[noww] += (r - l + 1) * addnum;
		return;
	}
	newlazy(noww,l,r);
	
	int mid = (l + r) >> 1;
	if(adl < mid){
		addnumber(adl,adr,noww * 2,l,mid,addnum);
	}
	if(adr > mid){
		addnumber(adl,adr,noww * 2 + 1,mid + 1,r,addnum);
	}
	ans[noww] = ans[noww * 2] + ans[noww * 2 + 1]; 
}

int searching(int sl,int sr,int noww,int l,int r){
	if(sl <= l && sr >= r){
		return ans[noww];
	}
	int res = 0,mid = (l + r) >> 1;
	newlazy(noww,l,r);
	if(sl <= mid){
		res += searching(sl,sr,noww * 2,l,mid);
	}
	if(sr > mid){
		res += searching(sl,sr,noww * 2 + 1,mid + 1,r);
	}
	return res;
}

int main(){
	ios_base::sync_with_stdio(false);
	cin>>n>>m;
	
	for(int i = 1;i <= n;i++){
		cin>>in[i];
	}
	
	build(1,1,n);
	
	int md,x,y,z;
	while(m != 0){
		m--;
		cin>>md;
		if(md == 1){
			cin>>x>>y>>z;
			addnumber(x,y,1,1,n,z);
		}else{
			cin>>x>>y;
			cout<<searching(x,y,1,n,1)<<endl;
		}
	}
	
	
	
	return 0;
}
 
2024/10/22 18:52
加载中...