codevs 1082 一维树状数组区间修改区间查询
2017-12-06 23:35
302 查看
吃什么
数组ca存的是修改区间覆盖当前点时应该加的值
数组cb存的是修改区间完全在当前点前面时对当前点的前缀和影响
当然还有其它情况
有时间的话会补图
另外一种方法
利用差分数组
写法可能更简洁
数学推导的思路比直接脑补容斥原理更简单一些
比如扩展到二维的 bzoj 3132
Sol
容斥+画图理解数组ca存的是修改区间覆盖当前点时应该加的值
数组cb存的是修改区间完全在当前点前面时对当前点的前缀和影响
当然还有其它情况
有时间的话会补图
另外一种方法
利用差分数组
写法可能更简洁
数学推导的思路比直接脑补容斥原理更简单一些
比如扩展到二维的 bzoj 3132
Code
// by spli #include<cstring> #include<cstdio> #include<algorithm> #include<iostream> #define LL long long using namespace std; const int N=200010; int n,m; LL a ; LL ca ,cb ; int lowbit(int x){return x&(-x);} void adda(int p,LL v){ for(int i=p;i<=n;i+=lowbit(i)) ca[i]+=v; } void addb(int p,LL v){ for(int i=p;i<=n;i+=lowbit(i)) cb[i]+=v; } LL sum(int x,int y){ LL ret=0; for(int i=x-1;i;i-=lowbit(i)) ret+=cb[i]-1ll*(x-1)*ca[i]; for(int i=y;i;i-=lowbit(i)) ret+=1ll*y*ca[i]-cb[i]; return ret; } int main(){ scanf("%d",&n); for(int i=1;i<=n;++i){ scanf("%lld",&a[i]); adda(i,a[i]); adda(i+1,-a[i]); addb(i,(i-1)*a[i]); addb(i+1,-i*a[i]); } int op,x,y; LL z; scanf("%d",&m); while(m--){ scanf("%d%d%d",&op,&x,&y); if(op==1){ scanf("%lld",&z); adda(x,z); adda(y+1,-z); addb(x,1ll*(x-1)*z); addb(y+1,-1ll*y*z); } if(op==2){ printf("%lld\n",sum(x,y)); } } return 0; }
相关文章推荐
- 【codevs1082】【树状数组】 区间修改 区间查询
- 【codevs1081】【树状数组】区间修改 单点查询
- 【原创】【数据结构】一维树状数组的基本操作(单点修改,区间查询) (HDU1166 敌兵布阵)
- 树状数组(二叉索引树 BIT Fenwick树) *【一维基础模板】(查询区间和+修改更新)
- 【算法系列学习】线段树vs树状数组 单点修改,区间查询 [kuangbin带你飞]专题七 线段树 A - 敌兵布阵
- 树状数组(单点修改区间查询、区间修改单点查询、区间修改区间查询)
- 树状数组单点修改区间查询
- 【LuoguP3038/[USACO11DEC]牧草种植Grass Planting】树链剖分+树状数组【树状数组的区间修改与区间查询】
- 树状数组总结——详解(单点/区间查询, 单点/区间修改, 逆序对)
- POJ-2763 Housewife Wind (树链剖分 入门题 树状数组 单点修改 区间查询)
- 数据结构----树状数组----二维区间的修改与查询
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- bzoj 3132 上帝造题的七分钟(二维树状数组区间修改区间查询模板)
- 树状数组总结——详解(单点/区间查询, 单点/区间修改, 逆序对)
- 一维树状数组区间更新区间查询
- 树状数组~poj3468~区间修改 区间查询
- 树状数组区间修改区间查询
- POJ 1195 Mobile phones(二维树状数组,点修改,区间查询)
- 【codevs1191】数轴染色 线段树 区间修改+固定区间查询
- 【树状数组】【单点修改区间求和】【区间修改单点查询】【单点修改区间最大值查询】