10pts求调
查看原帖
10pts求调
571298
byft楼主2023/11/3 13:18
#include<bits/stdc++.h>
#define int long long
using namespace std;
int a[1919810],dp[1919810],dp_[1919810];
void build(int l,int r,int f)
{
	
	if(l==r)
	{dp[f]=a[l];return;}
	int mid=l+r>>1;
	build(l,mid,f<<1);
	build(mid+1,r,f<<1|1);
	dp[f]=dp[f<<1]+dp[f<<1|1];
}
int plus_(int l,int r,int start,int end,int f)
{
	if(l<=start && r>=end)
		return dp[f];
	int mid=start+end>>1,ans=0;
	if(dp_[f])
	{
		dp[f<<1]+=dp_[f]*(mid-start+1),dp[f<<1|1]+=dp_[f]*(end-mid);
		dp_[f<<1]+=dp_[f],dp_[f<<1|1]+=dp_[f];
		dp_[f]=0;
		
	}
	if(l<=mid) ans+=plus_(l,r,start,mid,f<<1);
	if(r>mid) ans+=plus_(l,r,mid+1,end,f<<1|1);
	return ans; 
}
void update(int l,int r,int add,int start,int end,int f)
{
	if(l<=start && end<=r)
	{dp[f]+=(end-start+1)*add;dp_[f]+=add;return;}
	int mid=start+end>>1;
	if(dp_[f] && start!=end)
	{
		dp[f<<1]+=dp_[f]*(mid-start+1),dp[f<<1|1]+=dp_[f]*(end-mid);
		dp_[f<<1]+=dp_[f],dp[f<<1|1]+=dp_[f];
		dp_[f]=0;
	}
	if(l<=mid) update(l,r,add,start,mid,f<<1);
	if(r>mid) update(l,r,add,mid+1,end,f<<1|1);
	dp[f]=dp[f<<1]+dp[f<<1|1];
}
signed main()
{
	int n,m;
	scanf("%lld %lld",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	build(1,n,1);
	while(m--)
	{
		int op;
		scanf("%lld",&op);
		if(op==1)
		{
			int l,r,add;
			scanf("%lld %lld %lld",&l,&r,&add);
			update(l,r,add,1,n,1);
		}
		else
		{
			int l,r,add;
			scanf("%lld %lld",&l,&r);
			printf("%lld\n",plus_(l,r,1,n,1));
		}
	}
	return 0;
}

如果发现错误,请告诉我在哪个函数里的,谢谢!(悬棺

2023/11/3 13:18
加载中...