已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数加上x
2.求出某区间每一个数的和
给你几种情况:
1.查询多,修改少
修改:一个个枚举加上,以及后面的都加上
int x=read(), y=read(), z=read(); //从x到y都要加上z
for(int i=x;i<=y;i++)
for(int j=i;j<=n;j++) sum[j]+=z;
查询:前缀和思想直接解决掉
int x=read(), y=read(); //查询x到y区间
printf("%d\n", sum[y]-sum[x]);
2.修改多,查询少
修改:扫描线加头减尾
int x=read(), y=read(), z=read(); //从x到y都要加上z
cnt[x]+=z, cnt[y+1]-=z; //表示x以后都加上z,y+1及后面都减掉多余的z
查询:扫过去加起来
int x=read(), y=read(), sum=0, ans=0;
for(int i=1;i<=n;i++) //处理一下扫描线
sum+=cnt[i], cnt[i]=0, a[i]+=sum;
for(int i=x;i<=y;i++) ans+=a[i];
3.修改 查询 都很多的话。。。就是线段树嘛
可是线段数该怎么写呢?
请见下一章《线段树·区间》