震惊:某谷蒟蒻线段树竟只有10分
查看原帖
震惊:某谷蒟蒻线段树竟只有10分
219935
JeffWang2019楼主2020/6/21 17:53

样例过了

#include <bits/stdc++.h>
using namespace std;
long long int a[100001],res[100001],bas[100001];
long long int n,m,b;
void change(int l,int r,int x)
{
    int dl=l/b,dr=r/b;
    if(dl==dr)
    {
        for(int i=l;i<=r;i++)
        {
            a[i]+=x;
            res[dl]+=x;
        }
        return;
    }
    for(int i=l;i<dl*b;i++)
    {
        a[i]+=x;
        res[dl]+=x;
    }
    for(int i=dl;i<dr;i++)
    {
        bas[i]+=x;
        res[i]+=x*b;
    }
    for(int i=dr*b;i<=r;i++)
    {
        a[i]+=x;
        res[dr]+=x;
    }
}
long long int query(int l,int r)
{
    long long int ans=0;
    int dl=l/b,dr=r/b;
    if(dl==dr)
    {
        for(int i=l;i<=r;i++)
        {
            ans+=bas[dl]+a[i];
        }
    }
    else
    {
        for(int i=l;i<(dl+1)*b;i++)
        {
            ans+=bas[dl]+a[i];
        }
        for(int i=dl+1;i<dr;i++)
        {
            ans+=res[i];
        }
        for(int i=dr*b;i<=r;i++)
        {
            ans+=bas[dr]+a[i];
        }
    }
    return ans;
}
int main()
{
    scanf("%lld%lld",&n,&m);
    b=sqrt(n);
    for(int i=1;i<=n;i++)
    {
        scanf("%lld",&a[i]);
        res[i/b]+=a[i];
    }
    for(int i=1;i<=m;i++)
    {
        int f,x,y,k;
        scanf("%d",&f);
        if(f==1)
        {
            scanf("%d%d%d",&x,&y,&k);
            change(x,y,k);
        }
        else
        {
            scanf("%d%d",&x,&y);
            printf("%lld\n",query(x,y));
        }
    }
    return 0;
}
2020/6/21 17:53
加载中...