教练一直说受不了我的码风,让我一定要改,能帮我看一下哪里可以改进的吗?
随便找了一个长一点的代码:
#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;
}