60分,WA#4567,开了long long
查看原帖
60分,WA#4567,开了long long
148812
cxm1024楼主2021/8/22 20:03

rt,求助

#include<iostream>
using namespace std;
long long a[100010];
struct node
{
	long long l,r;
	long long val,lazy;
	node():val(0),lazy(0){}
}tree[400010];
void build(long long now,long long l,long long r)
{
	tree[now].l=l,tree[now].r=r;
	if(l==r)
	{
		tree[now].val=a[l];
		return;
	}
	long long mid=(l+r)/2;
	long long lson=now*2,rson=now*2+1;
	build(lson,l,mid);
	build(rson,mid+1,r);
	tree[now].val=tree[lson].val+tree[rson].val;
}
void add(long long now,long long l,long long r,long long val)
{
	if(tree[now].l==tree[now].r)
	{
		tree[now].val+=val;
		return;
	}
	if(l==tree[now].l&&r==tree[now].r)
	{
		tree[now].val+=(r-l+1)*val;
		tree[now].lazy+=val;
		return;
	}
	long long mid=(tree[now].l+tree[now].r)/2;
	long long lson=now*2,rson=now*2+1;
	if(r<=mid)
		add(lson,l,r,val);
	else if(l>mid)
		add(rson,l,r,val);
	else
		add(lson,l,mid,val),add(rson,mid+1,r,val);
	tree[now].val+=(r-l+1)*val;
}
long long sum(long long now,long long l,long long r)
{
    if(tree[now].l==tree[now].r)
	{
		tree[now].lazy=0;
		return tree[now].val;
	}
	if(l==tree[now].l&&r==tree[now].r)
		return tree[now].val;
	long long mid=(tree[now].l+tree[now].r)/2,res=0;
	long long lson=now*2,rson=now*2+1;
	tree[lson].lazy+=tree[now].lazy,tree[rson].lazy+=tree[now].lazy;
	tree[lson].val+=(mid-l+1)*tree[now].lazy,tree[rson].val+=(r-mid)*tree[now].lazy;
	tree[now].lazy=0;
	if(r<=mid)
		res=sum(lson,l,r);
	else if(l>mid)
		res=sum(rson,l,r);
	else
		res=sum(lson,l,mid)+sum(rson,mid+1,r);
	return res;
}
int main()
{
	ios::sync_with_stdio(false);
	long long n,m;
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(m--)
	{
		long long op,x,y,k;
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;
			add(1,x,y,k);
		}
		else
		{
			cin>>x>>y;
			cout<<sum(1,x,y)<<endl;
		}
	}
	return 0;
}
2021/8/22 20:03
加载中...