关于P2357 守墓人 区块做法的求助
查看原帖
关于P2357 守墓人 区块做法的求助
421421
Rem_CandleFire楼主2023/7/6 21:33

最后一个点TLE了许多次,开O2后显示WA

以下是代码,请大佬们提出意见,加以关注回报

#include<bits/stdc++.h>
using namespace std;
const int size=2e5+5;
long long n,m,a[size],sum[size],add[size],len;
int get(int x){ return x/len;}
void update(int l,int r,long long val)
{
	if(get(l)==get(r))
		for(int i=l;i<=r;i++)a[i]+=val,sum[get(i)]+=val;
	else
	{
		int i=l,j=r;
		while(get(i)==get(l))a[i]+=val,sum[get(i)]+=val,++i;
		while(get(j)==get(r))a[j]+=val,sum[get(j)]+=val,--j;
		for(int k=get(i);k<=get(j);k++)
			sum[k]+=len*val,add[k]+=val;
	}
}
long long query(int l,int r)
{
	long long ans=0;
	if(get(l)==get(r))
		for(int i=l;i<=r;i++)ans+=a[i]+add[get(l)];
	else
	{
		int i=l,j=r;
		while(get(i)==get(l))ans+=a[i]+add[get(i)],++i;
		while(get(j)==get(r))ans+=a[j]+add[get(j)],--j;
		for(int k=get(i);k<=get(j);k++) ans+=sum[k];
	}
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	len=sqrt(n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		sum[get(i)]+=a[i];
	}
	int mode,x,y;long long k;
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&mode);
		if(mode==1)
		{
			scanf("%d%d%lld",&x,&y,&k);
			update(x,y,k);
		}
		if(mode==2||mode==3)scanf("%lld",&k);
		if(mode==2)update(1,1,k);
		if(mode==3)update(1,1,-k);
		if(mode==4)
		{
			scanf("%d%d",&x,&y);
			printf("%lld\n",query(x,y));
		}
		if(mode==5)printf("%lld\n",query(1,1));
	}

	return 0;
}

2023/7/6 21:33
加载中...