会分块的请进
查看原帖
会分块的请进
264463
添哥楼主2022/3/26 14:19

20pts求助

#include<iostream>
#include<math.h>
using namespace std;
long long n,m,t,len;
long long a[100005],l[320],r[320],sum[320],lazy[320],pos[100005];
int main()
{
    cin>>n>>m;
    for(long long i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    len=sqrt(n);
    t=n/len;
    if(n%len!=0)
    {
        t++;
    }
    for(long long i=1;i<=t;i++)
    {
        l[i]=(i-1)*len+1;
        r[i]=i*len;
    }
    if(r[t]>n)
    {
        r[t]=n;
    }
    for(long long i=1;i<=t;i++)
    {
        for(long long j=l[i];j<=r[i];j++)
        {
            pos[j]=i;
            sum[i]+=a[j];
        }
    }
    while(m--)
    {
        long long opt,x,y,k;
        cin>>opt>>x>>y;
        if(opt==1)
        {
            cin>>k;
            if(pos[x]==pos[y])
            {
                for(long long i=x;i<=y;i++)
                {
                    a[i]+=k;
                    sum[pos[i]]+=k;
                }
            }
            else
            {
                for(long long i=x;i<=r[pos[x]];i++)
                {
                    a[i]+=k;
                    sum[pos[i]]+=k;
                }
                for(long long i=pos[x]+1;i<=pos[y]-1;i++)
                {
                    lazy[i]+=k;
                }
                for(long long i=l[pos[y]];i<=y;i++)
                {
                    a[i]+=k;
                    sum[pos[i]]+=k;
                }
            }
        }
        else
        {
            long long s=0;
            if(pos[x]==pos[y])
            {
                for(long long i=x;i<=y;i++)
                {
                    s+=a[i];
                }
            }
            else
            {
                for(long long i=x;i<=r[pos[x]];i++)
                {
                    s+=a[i]+lazy[pos[i]];
                }
                for(long long i=pos[x]+1;i<=pos[y]-1;i++)
                {
                    s+=sum[i]+lazy[i];
                }
                for(long long i=l[pos[y]];i<=y;i++)
                {
                    s+=a[i]+lazy[pos[i]];
                }
            }
            cout<<s<<endl;
        }
    }
}
2022/3/26 14:19
加载中...