分块

\(code:\)

void modify(int l,int r,ll v)
{
    for(int i=l;i<=min(S*bel[l],r);++i) a[i]+=v,sum[bel[l]]+=v;
    if(bel[l]!=bel[r])
        for(int i=S*(bel[r]-1)+1;i<=r;++i)
            a[i]+=v,sum[bel[r]]+=v;
    for(int i=bel[l]+1;i<=bel[r]-1;++i) add[i]+=v;
}
ll query(int l,int r)
{
    ll ans=0;
    for(int i=l;i<=min(S*bel[l],r);++i) ans+=a[i]+add[bel[l]];
    if(bel[l]!=bel[r])
        for(int i=S*(bel[r]-1)+1;i<=r;++i)
            ans+=a[i]+add[bel[r]];
    for(int i=bel[l]+1;i<=bel[r]-1;++i) ans+=sum[i]+S*add[i];
    return ans;
}

......

for(int i=1;i<=n;++i)
	read(a[i]),bel[i]=(i-1)/S+1,sum[bel[i]]+=a[i];
posted @ 2020-01-22 20:56  lhm_liu  阅读(118)  评论(0编辑  收藏  举报