树状数组区间修改区间查询
设区间修改加入的差分数组为\(d[i]\)
前缀和\(\sum^n_{i=1}\sum^i_{j=1}d[j]=\sum_{i=1}^nd[i]*(n-i+1)=(n+1)\sum^n_{i=1}d[i]+\sum^n_{i=1}d[i]*i\)
只需要单独维护\(d[i]*i\)和\(d[i]\)即可
inline void add(int x,int v){
for(int i=x;i<=n;i+=i&-i){
t1[i]+=v;t2[i]+=x*v;
}
}
inline int ask(int x){
int ret=0;
for(int i=x;i;i-=i&-i)
ret+=(x+1)*t1[i]-t2[i];
return ret;
}
作者:starusc
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文链接,否则保留追究法律责任的权利。

浙公网安备 33010602011771号