线段树求助
查看原帖
线段树求助
419519
一SakuRa楼主2021/9/20 14:38
#include<bits/stdc++.h>
using namespace std;
const int Maxn=100001;
int n,m,sum[Maxn<<2]={},a[Maxn]={},add[Maxn<<2]={};
int T,X,Y,Z;
inline void PushUp(int rt){
	sum[rt]=sum[rt<<1]+sum[rt<<1|1];
	return ;
}
inline void build(int l,int r,int rt){
	if(l==r){
		sum[rt]=a[l];
		return ;
	}
	int mid=(l+r)>>1;
	build(l,mid,rt<<1);
	build(mid+1,r,rt<<1|1);
	PushUp(rt);
	return ;
}
inline void PushDown(int l,int r,int rt){
	if(add[rt]){
		add[rt<<1]+=add[rt];
		add[rt<<1|1]+=add[rt];
		sum[rt<<1]+=add[rt]*l;
		sum[rt<<1|1]+=add[rt]*r;
		add[rt]=0;
	}
}
inline void once(int C,int L,int R,int l,int r,int rt){
	if(l==r){
		sum[rt]+=C*(r-l+1);
		add[rt]+=C;
		return ;
	}
	int mid=(l+r)>>1;
	PushDown(mid-l+1,r-mid,rt);
	if(L<=mid)
		once(C,L,R,l,mid,rt<<1);
	if(R>mid)
		once(C,L,R,mid+1,r,rt<<1|1);
	PushUp(rt);
	return ;
}
inline int anser(int L,int R,int l,int r,int rt){
	if(L<=l&&R>=r){
		return sum[rt];
	}
	int mid=(l+r)>>1;
	int ans=0;
	PushDown(mid-l+1,r-mid,rt);
	if(L<=mid)
		ans+=anser(L,R,l,mid,rt<<1);
	if(R>mid)
		ans+=anser(L,R,mid+1,r,rt<<1|1);
	return ans;
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,n,1);
	for(int i=1;i<=m;i++){
		scanf("%d%d%d",&T,&X,&Y);
		if(T==1){
			scanf("%d",&Z);
			once(Z,X,Y,1,n,1);
		}
		else{
			printf("%d\n",anser(X,Y,1,n,1));
		}
	}
	return 0;
}

我的代码,8,9,10三个点TLE

但是不知道该怎么改

求助一下

2021/9/20 14:38
加载中...