0分求改,能过样例,WA!
查看原帖
0分求改,能过样例,WA!
696431
lijunxi1楼主2023/10/4 20:42
#include<bits/stdc++.h>
using namespace std;
int n,m,zl,x,y,k;
long long xds[200005],a[200005],lb[200005];
long long js(int l,int r,int w)
{
	if(l==r)return xds[w]=a[l];
	int mid=(l+r)/2;
	return xds[w]=js(l,mid,w*2)+js(mid+1,r,w*2+1);
}
long long cz(int l,int r,int ml,int mr,int w)
{
	if(l==r)
	{
		if(l>=ml&&r<=mr)
		{
			xds[w]+=lb[w];
			lb[w]=0;
			return xds[w];
		}
		else return xds[w];
	}
	int mid=(l+r)/2;
	long long ans=0;
	lb[w*2]+=lb[w];
	lb[w*2+1]+=lb[w];
	xds[w]+=lb[w]*(r-l+1);
	lb[w]=0;
    if(l>=ml&&r<=mr)return xds[w];
	if(mid>=ml)ans+=cz(l,mid,ml,mr,w*2);
	if(mid+1>=ml&&mid+1<=mr)ans+=cz(mid+1,r,ml,mr,w*2+1);
	return ans;
}
void zj(int l,int r,int ml,int mr,int w,int k)
{
	if(l==r)
	{
		if(l>=ml&&l<=mr)
		{
			lb[w]+=k;
		}
		return;
	}
	int mid=(l+r)/2;
	long long ans=0;
	lb[w*2]+=lb[w];
	lb[w*2+1]+=lb[w];
	xds[w]+=lb[w]*(r-l+1);
	if(l<=ml&&r>=mr)xds[w]+=k*(mr-ml+1);
	else if(l<=ml&&r<=mr)xds[w]+=min(0,r-ml+1)*k;
	else if(l>=ml&&r>=mr)xds[w]+=min(0,mr-ml+1)*k;
	else xds[w]+=(r-l+1)*k;
	lb[w]=0;
    if(l>=ml&&r<=mr)
	{
		lb[w]=k;
		return;
	}
	if(mid>=ml&&l<=ml)zj(l,mid,ml,mr,w*2,k);
	if(mid+1>=ml&&mid+1<=mr)zj(mid+1,r,ml,mr,w*2+1,k);
	return;
}
int main ()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>a[i];
	js(1,n,1);
	while(m--)
	{
		cin>>zl>>x>>y;
		if(zl==1)
		{
			cin>>k;
			zj(1,n,x,y,1,k);
		}
		else cout<<cz(1,n,x,y,1)<<"\n";
	}
}
2023/10/4 20:42
加载中...