[loj6280]数列分块入门 4,原本是道很水的分块模板题的,提交上去WA 0 分,本地过得去,调了30分钟了,帮忙看看,谢谢了
C++代码:
#include<bits/stdc++.h>
using namespace std;
int n,l[50001]={0},r[50001]={0},pos[50001]={0};
long long a[50001]={0},sum[50001]={0},add[50001]={0};
void build(){
int t=sqrt(n*1.0),num=n/t;
if(n%t>0) num++;
for(int i=1;i<=num;i++){
l[i]=(i-1)*t+1;
r[i]=i*t;
}
r[num]=n;
for(int i=1;i<=num;i++){
for(int j=l[i];j<=r[i];j++){
pos[j]=i;
sum[i]+=a[j];
}
}
}
void change(int x,int y,long long z){
int p=pos[x],q=pos[y];
if(p==q){
for(int i=x;i<=y;i++) a[i]+=z;
sum[p]+=z*(y-x+1);
}else{
for(int i=p+1;i<=q-1;i++) add[i]+=z;
for(int i=x;i<=r[p];i++) a[i]+=z;
sum[p]+=z*(r[p]-x+1);
for(int i=l[q];i<=y;i++) a[i]+=z;
sum[q]+=z*(y-l[q]+1);
}
}
long long query(int x,int y){
int p=pos[x],q=pos[y];
long long ans=0;
if(p==q){
for(int i=x;i<=y;i++) ans+=a[i];
ans+=add[p]*(y-x+1);
}else{
for(int i=p+1;i<=q-1;i++) ans+=sum[i]+add[i]*(r[i]-l[i]+1);
for(int i=x;i<=r[p];i++) ans+=a[i];
ans+=add[p]*(r[p]-x+1);
for(int i=l[q];i<=y;i++) ans+=a[i];
ans+=add[q]*(y-r[q]+1);
}
return ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
build();
for(int i=1;i<=n;i++){
int x,y,z,k;
scanf("%d%d%d%d",&x,&y,&z,&k);
if(x==0) change(y,z,k);
else printf("%lld\n",query(y,z)%(k+1));
}
return 0;
}