70points,求助!
查看原帖
70points,求助!
355521
rainbow_star楼主2021/8/1 20:34
#include<iostream> 
#include<cstdio>
#include<cmath>
using namespace std;
long long n,m;
long long arr[100001],num,x,y,k;
long long tree[400004],maxx,ans,lazytag[400004];
void build_tree(long long node,long long l,long long r)
{
	if(l==r)
	{
		maxx=max(node,maxx);
		tree[node]=arr[l];
		return;
	}
	long long mid=(l+r)/2;
	build_tree(node*2+1,l,mid);
	build_tree(node*2+2,mid+1,r);
	tree[node]=tree[node*2+1]+tree[node*2+2];
}
int summ(long long node,long long l,long long r,long long L,long long R)
{
	if(lazytag[node]!=0)
	{
		tree[node]+=(r-l+1)*lazytag[node];
		if(l!=r)
		{
			lazytag[node*2+1]+=lazytag[node];
			lazytag[node*2+2]+=lazytag[node];
		}
		else
			arr[l]=tree[node];
		lazytag[node]=0;
	}
	if(l>R||r<L||L>R)
		return 0;
	if(l==r)
		return arr[l];
	if(l==L&&r==R)
		return tree[node];
	long long mid=(l+r)/2;
	return summ(node*2+1,l,mid,L,min(mid,R))+summ(node*2+2,mid+1,r,max(L,mid+1),R);
}
void add(long long node,long long l,long long r,long long L,long long R)
{
	if(l>R||r<L||L>R)
		return;
	if(l==r)
	{
		arr[l]+=k;
		tree[node]+=k;
		return; 
	}
	if(l==L&&r==R)
	{
		lazytag[node]+=k;
		return;
	}
	long long mid=(l+r)/2;
	tree[node]+=((min(r,R)-max(L,l)+1)*k);
	add(node*2+1,l,mid,L,min(mid,R));
	add(node*2+2,mid+1,r,max(L,mid+1),R);
}
int main()
{
	scanf("%lld%lld",&n,&m);
	long long i;
	for(i=1;i<=n;i++)
		scanf("%lld",&arr[i]);
	build_tree(0,1,n);
	for(i=1;i<=m;i++)
	{
		scanf("%lld",&num);
		if(num==1)
		{
			scanf("%lld%lld%lld",&x,&y,&k);
			add(0,1,n,x,y);
		}
		else
		{
			scanf("%lld%lld",&x,&y);
			printf("%lld\n",summ(0,1,n,x,y));
		}
	}
	return 0;
}

后3个点WA,所有变量都开了long long

2021/8/1 20:34
加载中...