萌新线段树写挂了,求助/kk
查看原帖
萌新线段树写挂了,求助/kk
307603
_cmh楼主2020/7/3 21:38

RT

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<string>
#include<cstdlib>
using namespace std;
int q,x,y,z,n,m,a[100001],b[200001],d[200001];
void build(int s,int t,int p){
	if(s==t){
		d[p]=a[s];
		return;
	}
	int mid=(s+t)/2;
	build(s,mid,p*2);
	build(mid+1,t,p*2+1); 
	d[p]=d[p*2]+d[p*2+1];
}
void update(int l,int r,int c,int s,int t,int p){
	if(l==s&&r==t){
		d[p]+=(t-s+1)*c;
		b[p]+=c;
		return;
	}
	int mid=(s+t)/2;
	if(b[p]&&s!=t){
		d[p*2]+=b[p]*(mid-s+1),d[p*2+1]+=b[p]*(t-mid);
		b[p*2]+=b[p],b[p*2+1]+=b[p];
		b[p]=0;
	}
	if(l<=mid) 
		update(l,r,c,s,mid,p*2);
	else if(r>mid) 
		update(l,r,c,mid+1,t,p*2+1);
	d[p]=d[p*2]+d[p*2+1];
}
void getsum(int l,int r,int s,int t,int p){
	if(l==s&&r==t)
		return d[p];
	int mid=(s+t)/2;
	if(b[p]){
		d[p*2]+=b[p]*(mid-s+1),d[p*2+1]+=b[p]*(t-mid);
		b[p*2]+=b[p],b[p*2+1]+=b[p];
		b[p]=0;
	}
	int sum=0;
	if(l<=mid) 
		sum+=getsum(l,r,s,mid,p*2);
	else if(r>mid) 
		sum+=getsum(l,r,mid+1,t,p*2+1);
	return sum;
}
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>>q>>x>>y;
		if(a==1){
			cin>>z;	
			update(x,y,z,1,n,1);
		} 
		else cout<<getsum(x,y,1,n,1)<<endl;
	}
    return 0;
}
2020/7/3 21:38
加载中...