区间加法,区间平方和,TLE 数据范围1100000 求助
查看原帖
区间加法,区间平方和,TLE 数据范围1100000 求助
161296
DarksideCoderω楼主2020/8/21 16:40
#include<cstdio>
#include<cstring>
template<typename Type>inline Type Max(Type x,Type y){if(x>y)return x;return y;}
template<typename Type>inline Type Min(Type x,Type y){if(x<y)return x;return y;}
template<typename Type>inline Type Swap(Type &x,Type &y){Type swap=x;x=y;y=swap;}
template<typename Type=long long,int MaxCnt=3010000>struct Segment_Tree
{
	Segment_Tree(){Clean();}
	Type DataA[MaxCnt],DataSqrA[MaxCnt],Covertag[MaxCnt];int Son[MaxCnt][2],Left[MaxCnt],Right[MaxCnt],cnt,root;
	inline void Clean(){memset(this,0,sizeof(this));}
	inline void PushUp(int now)
	{
		DataA[now]=DataA[Son[now][0]]+DataA[Son[now][1]];
		DataSqrA[now]=DataSqrA[Son[now][0]]+DataSqrA[Son[now][1]];
	}
	inline void PushDown(int now)
	{
		if(Son[now][0])
		{
			Covertag[Son[now][0]]+=Covertag[now];
			DataSqrA[Son[now][0]]+=Covertag[now]*Covertag[now]*(Right[Son[now][0]]-Left[Son[now][0]]+1)+2*Covertag[now]*DataA[Son[now][0]];
			DataA[Son[now][0]]+=Covertag[now]*(Right[Son[now][0]]-Left[Son[now][0]]+1);
		}
		if(Son[now][1])
		{
			Covertag[Son[now][1]]+=Covertag[now];
			DataSqrA[Son[now][1]]+=Covertag[now]*Covertag[now]*(Right[Son[now][1]]-Left[Son[now][1]]+1)+2*Covertag[now]*DataA[Son[now][1]];
			DataA[Son[now][1]]+=Covertag[now]*(Right[Son[now][1]]-Left[Son[now][1]]+1);
		}
	}
	inline void Build(int &now,int left,int right,int *Arr)
	{
		now=++cnt;
		Left[now]=left;Right[now]=right;
		if(left==right){DataA[now]=Arr[left];DataSqrA[now]=Arr[left]*Arr[right];return;}
		else
		{
			int mid=(left+right)>>1;
			Build(Son[now][0],left,mid,Arr);
			Build(Son[now][1],mid+1,right,Arr);
			PushUp(now);
		}
	}
	inline void Modify(int now,int left,int right,int value)
	{
		PushDown(now);
		if(left<=Left[now]&&Right[now]<=right)
		{
			Covertag[now]=value;
			DataSqrA[now]+=Covertag[now]*Covertag[now]*(Right[now]-Left[now])+2*Covertag[now]*DataA[now];
			DataA[now]+=Covertag[now]*(Right[now]-Left[now]);
			return;
		}
		else
		{
			int mid=(Left[now]+Right[now])>>1;
			if(right<=mid)Modify(Son[now][0],left,right,value);
			else if(mid+1<=left)Modify(Son[now][1],left,right,value);
			else
			{
				Modify(Son[now][0],left,right,value);
				Modify(Son[now][1],left,right,value);
			}
			PushUp(now);
		}
	}
	inline Type Query(int now,int left,int right)
	{
		PushDown(now);
		if(left<=Left[now]&&Right[now]<=right){return DataSqrA[now];}
		else
		{
			int mid=(Left[now]+Right[now])>>1;
			if(right<=mid)return Query(Son[now][0],left,right);
			else if(mid+1<=left)return Query(Son[now][1],left,right);
			else return Query(Son[now][0],left,right)+Query(Son[now][1],left,right);
		}
	}
};Segment_Tree<>T;
int n,m,Arr[1100000];
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&Arr[i]);
	T.Build(T.root,1,n,Arr);
	for(int i=1;i<=m;i++)
	{
		int opt,l,r;
		scanf("%d%d%d",&opt,&l,&r);
		if(opt==0)
		{
			long long k;scanf("%lld",&k);
			T.Modify(T.root,l,r,k);
		}
		else
		{
			printf("%lld\n",T.Query(T.root,l,r));
		}
	}
	return 0;
}
2020/8/21 16:40
加载中...