70分求救
查看原帖
70分求救
499021
曹彬皓cbh楼主2022/9/17 10:11
#include<bits/stdc++.h>
using namespace std;
const int max1=1e5+100;
long long t,n,q1,L[max1/10],R[max1/10],pos[max1];
long long ly[max1],a[max1],sum[max1];
char a1;
void cs()
{
	t=sqrt(n*1.0);
	int num=n/t;
	if(n%t)
	{
		num++;
	}
	for(int i=1;i<=num;i++)
	{
		for(int j=1;j<=t;j++)
		{
			pos[(i-1)*t+j]=i;
			sum[i]+=a[(i-1)*t+j];
		}
		L[i]=(i-1)*t+1;
		R[i]=i*t;
	}
	R[num]=n;
}
void qjxg(long long l,long long r,long long v)
{
	int p=pos[l],q=pos[r];
	if(p==q)
	{
		for(int i=l;i<=r;i++)
		{
			a[i]+=v;
			sum[p]+=v;
		}
	}
	else
	{
		for(int i=p+1;i<=q-1;i++)
		{
			ly[i]+=v;
		}
		for(int i=l;i<=R[p];i++)
		{
			a[i]+=v;
			sum[p]+=v;
		}
		for(int i=L[q];i<=r;i++)
		{
			a[i]+=v;
			sum[q]+=v;
		}
	}
}
long long xw(long long l,long long r)
{
	long long p=pos[l],q=pos[r];
	long long s=0;
	if(p==q)
	{
		for(int i=l;i<=r;i++)
		{
			s+=a[i];
		}
		s+=ly[p]*(r-l+1);
	}
	else
	{
		for(int i=p+1;i<=q-1;i++)
		{
			s+=ly[i]*(R[i]-L[i]+1)+sum[i];
		}
		for(int i=l;i<=R[p];i++)
		{
			s+=a[i];
		}
		s+=ly[p]*(R[p]-l+1);
		for(int i=L[q];i<=r;i++)
		{
			s+=a[i];
		}
		s+=ly[q]*(r-L[q]+1);
	}
	return s;
}
int main()
{
	scanf("%d%d",&n,&q1);
	for(int i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	cs();
	for(int i=1;i<=q1;i++)
	{
		cin>>a1;
		if(a1=='1')
		{
			int b1,b2,b3;
			scanf("%d%d%d",&b1,&b2,&b3);
			qjxg(b1,b2,b3);
		}
		if(a1=='2')
		{
			int b1,b2;
			scanf("%d%d",&b1,&b2);
			printf("%lld\n",xw(b1,b2));
		}
	}
	return 0;
}

最后三个点错了

2022/9/17 10:11
加载中...