区间树状数组
来源:互联网 发布:Windows VPN 编辑:程序博客网 时间:2024/05/17 07:07
一开始以为区间树状数组没什么区别,xjb乱搞了后调了好久都调不出来QAQ
首先有一个差分数组di
d[i]=a[i]-a[i-1];
所以a[x]=d[1]+d[2]+…+d[x]
a[x]前缀和:d[1]x+d[2] (x-1)+…+ d[i] * (x-i+1)+…+ d[x] *1
维护 d[i] 和 d[i]*i
注意:
代码中的e[i]不等于上文的d[i](其实是d[ i ]的树状数组)
f[i]不等于d[i]i(其实是 d[ i ] i 的树状数组)
codevs
Update(10月2日):
这个码风太丑了,以下是我新的区间树状数组的部分代码
void Ins(int x,int y){ for(int i=x;i<=n;i+=lb(i))f[i]+=y,g[i]+=x*y;}LL Sum(int x){ LL sum=0; for(int i=x;i>=1;i-=lb(i))sum=(sum+(x+1)*f[i]-g[i]+mod)%mod; return sum;}
完整AC代码(旧)
#include<cstdio>#include<iostream>#define N 200010typedef long long LL;using namespace std;int n,m,o,p,q,x,y;LL e[N],f[N];int lowbit(int x){ return x&(-x);}void update(int x,int y){ int z=y*x; while(x<=n){ f[x]+=z; e[x]+=y; x+=lowbit(x); }}LL query(int x){ LL sum=0; while(x>=1){ sum+=e[x]; x-=lowbit(x); } return sum;}LL Sum(int x){ LL sum=0; while(x>=1){ sum+=f[x]; x-=lowbit(x); } return sum;}LL Solve(int p,int q){ return (q+1)*query(q)-Sum(q)+Sum(p-1)-p*query(p-1);}int main(){ freopen("data.txt","r",stdin); scanf("%d",&n); for(int i=1;i<=n;i++){ scanf("%d",&p); update(i,p-q); q=p; } scanf("%d",&m); for(int i=1;i<=m;i++){ scanf("%d",&o); if(o==1){ scanf("%d%d%d",&p,&q,&y); update(p,y); update(q+1,-y); } else if(o==2){ scanf("%d%d",&p,&q); printf("%lld\n",Solve(p,q)); } }}
阅读全文
0 0
- 树状数组--区间求和
- 树状数组 区间更新
- 树状数组区间更新
- 树状数组,区间求和
- 区间树状数组
- 树状数组 区间和
- 树状数组 区间修改
- hdu1556树状数组更新区间
- 树状数组-区间和-插线问点
- 树状数组写区间最大值
- 树状数组区间修改 neu1454
- 树状数组之区间求最值
- 树状数组求区间最大值
- 树状数组区间更新 hdu4031
- 树状数组 区间修改查询
- 树状数组求区间和
- 树状数组求区间极值
- 树状数组求区间极值
- 扩增子图表解读4曼哈顿图:差异分类级别Taxonomy
- request session
- git 一些命令操作
- c++primer关联容器中的“单词转换map程序”分析
- MySQL创建用户
- 区间树状数组
- POJ 3723 Conscription(mst)
- CC3200-PWM
- 简单计算器
- js面向对象组件开发框架
- 对草绘建模曲面膨胀算法的理解
- 网络编程基础一
- 你应该知道的AssetBundle管理机制
- 如何使一个div的宽和高占整个屏幕