萌新,刚学,不会,求助
查看原帖
萌新,刚学,不会,求助
217743
sc84bbs楼主2020/12/1 20:27

RT

我摊牌了我不会线段树板子

#include<bits/stdc++.h>
using namespace std;
int n,m,tree[400005],a[100005],lazy[400005],sum[400005];
int lson(int qwq){
	return qwq*2;
}
int rson(int qwq){
	return qwq*2+1;
}
void update(int index){
	sum[index]=sum[lson(index)]+sum[rson(index)];
}
void dpd(int index,int l,int r,int z){
	lazy[index]+=z;
	sum[index]+=z*(r-l+1); 
}
void downdate(int index,int l,int r){
	int mid=(l+r)/2;
	dpd(lson(index),l,mid,lazy[index]);
	dpd(rson(index),mid+1,r,lazy[index]);
	lazy[index]=0;
}
void buildtree(int index,int l,int r){
	lazy[index]=0;
	if(l==r){
		sum[index]=a[l];
		return;
	}
	int mid=(l+r)/2;
	buildtree(lson(index),l,mid);
	buildtree(rson(index),mid+1,r);
	update(index);
}
int query(int index,int nl,int nr,int cl,int cr){
	
	if(nl>cr)return 998244353;
	if(nr<cl)return 998244353;
	if(cl<=nl&&cr>=nr)return sum[index];
	int mid=(nl+nr)/2;
	int msum=0;
	if(mid>=cl)msum+=query(lson(index),nl,mid,cl,cr);
	if(mid+1<=cr)msum+=query(rson(index),mid+1,nr,cl,cr);
	return msum;
}
void upd(int index,int nl,int nr,int cl,int cr,int z){
	if(nl>cr||nr<cl)return;	
	if(cl<=nl&&cr>=nr){
		dpd(index,nl,nr,z);
		return;
	}
	downdate(index,nl,nr);
	int mid=(nl+nr)/2;
	
	if(mid>=cl)upd(lson(index),nl,mid,cl,cr,z);
	if(mid+1<=cr)upd(rson(index),mid+1,nr,cl,cr,z);
	update(index);
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}	
	buildtree(1,1,n);
	for(int i=0;i<m;i++){
		int q,w,e,r;
		cin>>q>>w>>e;
		if(q==1){
			cin>>r;
			upd(1,1,n,w,e,r);
		}else{
			cout<<query(1,1,n,w,e)<<endl;
		}
	} 
	return 0;
}
2020/12/1 20:27
加载中...