求助码风问题(玄关)
  • 板块灌水区
  • 楼主yinbe2
  • 当前回复8
  • 已保存回复8
  • 发布时间2024/4/3 23:03
  • 上次更新2024/4/4 10:42:01
查看原帖
求助码风问题(玄关)
1285691
yinbe2楼主2024/4/3 23:03

教练一直说受不了我的码风,让我一定要改,能帮我看一下哪里可以改进的吗?

随便找了一个长一点的代码:

#include<iostream>
#include<cmath>
using namespace std;
long long n,m,t;
long long a[100005],sum[500],add[100005],block[100005];
long long block_l[500],block_r[500];
void change(long long l,long long r,long long x)
{
	long long x_l=block[l],x_r=block[r];
	if(x_l==x_r)
	{
		for(long long i=l;i<=r;i++)
		{
			a[i]+=x;
		}
		sum[x_l]+=(r-l+1)*x;
		return;
	}
	if(block_l[x_l]!=l)
	{
		for(long long i=l;i<=block_r[x_l];i++)
		{
			a[i]+=x;
		}
		sum[x_l]+=(block_r[x_l]-l+1)*x;
		x_l++;
	}
	if(block_r[x_r]!=r)
	{
		for(long long i=block_l[x_r];i<=r;i++)
		{
			a[i]+=x;
		}
		sum[x_r]+=(r-block_l[x_r]+1)*x;
		x_r--;
	}
	for(long long i=x_l;i<=x_r;i++)
	{
		sum[i]+=(block_r[i]-block_l[i]+1)*x;
		add[i]+=x;
	}
	return;
}
long long ask(long long l,long long r)
{
	long long x_l=block[l],x_r=block[r];
	long long ans=0;
	if(x_l==x_r)
	{
		for(long long i=l;i<=r;i++)
		{
			ans+=a[i];
		}
		ans+=add[x_l]*(r-l+1);
		return ans;
	}
	if(block_l[x_l]!=l)
	{
		for(long long i=l;i<=block_r[x_l];i++)
		{
			ans+=a[i];
		}
		ans+=(block_r[x_l]-l+1)*add[x_l];
		x_l++;
	}
	if(block_r[x_r]!=r)
	{
		for(long long i=block_l[x_r];i<=r;i++)
		{
			ans+=a[i];
		}
		ans+=(r-block_l[x_r]+1)*add[x_r];
		x_r--;
	}
	for(long long i=x_l;i<=x_r;i++)
	{
		ans+=sum[i];
	}
	return ans;
}
int main()
{
//	freopen("P3372_4.in","r",stdin);
//	freopen("test.out","w",stdout);
	scanf("%lld%lld",&n,&m);
	t=sqrt(n);
	for(long long i=1;i<=n;i++)
	{
		scanf("%lld",&a[i]);
	}
	for(long long i=1;i<=t;i++)
	{
        block_l[i]=(i-1)*t+1;
		block_r[i]=i*t;
		for(long long j=block_l[i];j<=block_r[i];j++)
		{
			sum[i]+=a[j];
			block[j]=i;
		}
	}
	if(block_r[n/t]!=n)
	{
		block_l[t+1]=t*t+1;
		block_r[t+1]=n;
		for(long long j=block_l[t+1];j<=block_r[t+1];j++)
		{
			sum[t+1]+=a[j];
			block[j]=t+1;
		}	
	}
	while(m--)
	{
		long long op;
		scanf("%lld",&op);
		if(op==1)
		{
			long long l,r;
			long long k;
			scanf("%lld%lld%lld",&l,&r,&k);
			change(l,r,k);
		}
		else
		{
			long long l,r;
			scanf("%lld%lld",&l,&r);
			printf("%lld\n",ask(l,r));
		}
	}
	return 0;
}
2024/4/3 23:03
加载中...