树状数组(2)
来源:互联网 发布:网络新词贫民窟女孩 编辑:程序博客网 时间:2024/06/05 18:26
操作:区间修改,求单点值。
转化思路:把对区间的修改转化为修改两次点的值。
设输入数据储存在a[i]中。
设b[i]=a[i]-a[i-1]。
则任意点x的值可以表示为
修改区间的指令add(l,r,x)即可转化为:
b[l]+=x; b[r+1]-=x;
对于S数组,又是求和的表示形式,可以交给BIT。
假设用c[]来充当S[]的BIT,则
c[x]=S[x]-S[x-lowbit(x)]
=
=a[i]-a[x-lowbit(x)]
所以在具体实现中,只需要两个数组a[]和c[]即可完成操作。
查询query(x)用BIT的基本查询操作完成。
#include <cstdio>#include <iostream>using namespace std;#define maxn 100000+10long n,m,l,t,x;long a[maxn],c[maxn];long lowbit(long x){ return x&(-x);}void read(){ cin>>n; for(long i=1;i<=n;i++) cin>>a[i]; for(long i=1;i<=n;i++) c[i]=a[i]-a[i-lowbit(i)];}void add(long k,long x){ for(;k<=n;k+=lowbit(k)) c[k]+=x;}void query(long k){ long sum=0; for(;k>0;k-=lowbit(k)) sum+=c[k]; cout<<sum<<endl;}void work(){ cin>>m; for(long i=1;i<=m;i++) { int p; cin>>p; if(p==1) { cin>>l>>t>>x; add(l,x); add(t+1,-x); } else { cin>>x; query(x); } }}int main(){ ios::sync_with_stdio(false); read(); work(); return 0;}
0 0
- hust1433-树状数组-2
- hdu4000-树状数组-2
- 树状数组(2)
- 树状数组(2)
- 树状数组(2)
- 树状数组(2)
- 【模板】树状数组 2
- 树状数组模板2
- 【模板】树状数组2
- 23th 【树状数组】树状数组1&&2
- [caioj 树状数组2(破坏公路)]---树状数组
- 【洛谷3368】树状数组 2 树状数组+差分
- 洛谷3368树状数组2
- c++树状数组2模板
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 未来你好 记于2015-01-01
- Set IP automatically in Windows
- 云计算市场风云迭起,如何采用云战略?
- js 日期加减
- iOS-BLE流程图
- 树状数组(2)
- Elyar的java笔记--Java简单文件操作
- 在eclipse中配置tomcat
- wifi基础知识
- 通用队列参数(Grneral Queue Parameters)
- Android学习 - Shell命令(正则式简介)
- 修改xml中某节点的值
- 仿struts2模式的servletOrFilter实现
- ajax 请求php 报错404 但脚本能够正常输出数据 问题的解决方法