0分求助,样例正确,测试点1只有最后一个数是错的
查看原帖
0分求助,样例正确,测试点1只有最后一个数是错的
1413040
Hayya楼主2024/11/13 21:49
#include<bits/stdc++.h>
using namespace std;
int n,m,d,x,y,k,ll,l[263000],r[263000],b[132000],lazy[263000],top;long long a[263000],ans[100100];
void work1(int i)
{
	if(x<=l[i]&&r[i]<=y) 
	{
	lazy[i]+=k;
	a[i]+=k*(r[i]-l[i]+1); 
	}
	else if((y<=r[i]&&y>=l[i])||(x<=r[i]&&x>=l[i]))
	{
		lazy[2*i]+=lazy[i]; lazy[2*i+1]+=lazy[i];
		lazy[i]=0;
		work1(2*i);work1(2*i+1);
		a[i]=a[i*2]+a[i*2+1];
	}
}
void work2(int i)
{
	if(x<=l[i]&&r[i]<=y)
	{
	
	ans[top]+=a[i];
	}
	
	else if((y<=r[i]&&y>=l[i])||(x<=r[i]&&x>=l[i])) 
	{
		lazy[2*i]+=lazy[i];lazy[2*i+1]+=lazy[i];
		if(x<=l[i*2]&&r[i*2]<=y) a[i*2]+=lazy[i]*(r[2*i]-l[2*i]+1);
		if(x<=l[i*2+1]&&r[i*2+1]<=y) a[i*2+1]+=lazy[i]*(r[2*i+1]-l[2*i+1]+1);
		lazy[i]=0;
		work2(2*i);work2(2*i+1);
		a[i]=a[i*2]+a[i*2+1];
	}
}
int main()
{
	ios::sync_with_stdio(false);
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>b[i];
		
	}
	if(n!=pow(2,log2(n))) ll=pow(2,int(log2(n))+1);
	else ll=n;
	for(int i=ll*2-1;i>=1;i--)
	{
		if(i<=ll-1) 
		{
		
			a[i]=a[i*2]+a[i*2+1];
			l[i]=l[2*i];r[i]=r[2*i+1]; 
		}
		else 
		{
			a[i]=b[i-ll+1];
			l[i]=i-ll+1;r[i]=i-ll+1;
		}
	}
	
	for(int i=1;i<=m;i++)
	{
		cin>>d;
		if(d==1)
		{
			cin>>x>>y>>k;
			work1(1);
		}
		else 
		{
			cin>>x>>y;
			top++;
			work2(1);
			
	    }
	}
	for(int i=1;i<=top;i++)
		cout<<ans[i]<<endl;
	return 0;
}```

2024/11/13 21:49
加载中...