求助,分块wa ,60分
查看原帖
求助,分块wa ,60分
436373
yanshenshizu楼主2021/7/11 10:18
using namespace std;
inline long long read()
{
	long long x=0;bool flag=1;char ch=getchar();
	while(ch>'9'||ch<'0'){if(ch=='-')flag=0;ch=getchar();}
	while(ch<='9'&&ch>='0'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}
	if(flag)return x;
	else return ~(x-1);
}
#define read(c) c=read()
long long a[100050];
int st[105000],ed[105000];
int belong[100050];
int n,f;
long long sum[105000];
long long mark[105000],size[105000];
void change(int l,int r,int k)
{
	if(belong[l]==belong[r])
	{
		for(int i=l;i<=r;i++)
		{
			a[i]+=k;sum[belong[i]]+=k;
		}
	}
	else
	{
		for(int i=l;i<=ed[belong[l]];i++)
		{
			a[i]+=k;sum[belong[i]]+=k;
		}
		for(int i=st[belong[r]];i<=r;i++)
		{
			a[i]+=k;sum[belong[i]]+=k;
		}
		for(int i=belong[l]+1;i<belong[r];i++)
		{
			mark[i]+=k;
		}
	}
}
long long inquire(int l,int r)
{
	long long ans=0;
	if(belong[l]==belong[r])
	{
		for(int i=l;i<=r;i++)
		{
			ans+=a[i]+mark[belong[i]];
		}
	}
	else
	{
		for(int i=l;i<=ed[belong[l]];i++)
		{
			ans+=a[i]+mark[belong[i]];
		}
		for(int i=st[belong[r]];i<=r;i++)
		{
			ans+=a[i]+mark[belong[i]];
		}
		for(int i=belong[l]+1;i<belong[r];i++)
		{
			ans+=sum[i]+size[i]*mark[i];
		}
	}
	return ans;
}
int main()
{
	scanf("%d%d",&n,&f);
	for(int i=1;i<=n;i++)
	{
		read(a[i]);
	}
	int sq=sqrt(n);
	for(int i=1;i<=sq;i++)
	{
		st[i]=n/sq*(i-1)+1;
		ed[i]=n/sq*i;
	}
	ed[sq]=n;
	for(int i=1;i<=sq;i++)
		for(int j=st[i];j<=ed[i];j++)
		{
			belong[j]=i;sum[i]+=a[j];
		}
	for(int i=1;i<=sq;i++)
	{
		size[i]=ed[i]-st[i]+1;
	}
	while(f--)
	{
		int ch;
		read(ch);
		if(ch==1)
		{
			int l,r,k;read(l);read(r);read(k);
			change(l,r,k);
		}
		else if(ch==2)
		{
			int k;read(k);
			change(1,1,k);
		}
		else if(ch==3)
		{
			int k;read(k);
			change(1,1,-k);
		}
		else if(ch==4)
		{
			int l,r;read(l);read(r);
			printf("%lld\n",inquire(l,r));
		}
		else
		{
			printf("%lld\n",inquire(1,1));
		}
	}
	return 0;
}```
2021/7/11 10:18
加载中...