树状数组
来源:互联网 发布:脸型测试软件 编辑:程序博客网 时间:2024/06/05 20:24
C++实现树状数组(结构体版)编辑
#include<iostream>#include<vector>using namespace std;class BinTree:vector<int>{ public: explicit BinTree(int k=0)//默认初始化一个能保存k个元素的空树状数组 { assign(k+1,0);//有效下标从1开始,0仅作逻辑用处 } int lowbit(int k) { return k&-k; //也可写作x&(x^(x–1)) } int sum(int k)//求第1个元素到第n个元素的和 { return k>0?sum(k-lowbit(k))+(*this)[k]:0; } int last()//返回最后一个元素下标 { return size()-1; } void add(int k,int w)//为节点k加上w { if(k>last())return; (*this)[k]+=w; add(k+lowbit(k),w); }};int main(){ BinTree test(123); test.add(27,72); cout<<test.sum(26)<<' '<<test.sum(27)<<' '<<test.sum(123);}
C++实现树状数组(函数版)编辑
#include<iostream>using namespace std;int n,m,i,num[100001],t[200001],l,r;//num:原数组;t:树状数组 int lowbit(int x){ return x&(-x);}void change(int x,int p)//将第x个数加p { while(x<=n) { t[x]+=p; x+=lowbit(x); } return;}int sum(int k)//前k个数的和 { int ans=0; while(k>0) { ans+=t[k]; k-=lowbit(k); } return ans;}int ask(int l,int r)//求l-r区间和 { return sum(r)-sum(l-1); }int main(){ cin>>n>>m; for(i=1;i<=n;i++) { cin>>num[i]; change(i,num[i]); } for(i=1;i<=m;i++) { cin>>l>>r; cout<<ask(l,r)<<endl; } return 0;}
void add(int k,int num) { while(k<=n) { tree[k]+=num; k+=k&-k; } } int read(int k)//1~k的区间和 { int sum=0; while(k) { sum+=tree[k]; k-=k&-k; } return sum; }
http://blog.csdn.net/zearot/article/details/45028723
http://blog.csdn.net/int64ago/article/details/7429868
0 0
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 动态添加删除网卡
- 为 instance 配置静态 IP
- 最简单的 RabbitMQ 监控方法
- instance “error” 了怎么办?- 每天5分钟玩转 OpenStack(159)
- Troubleshooting OpenStack 瘫痪
- 树状数组
- poj 1700 贪心过河
- scanf()、gets()和getline()读取输入
- asp.net 删除确认对话框
- 解决YUM下Loaded plugins: fastestmirror Determining fastest mirrors
- springmvc中forward和redirect
- asp.net 捕获用户操作 确认删除
- c代码处理
- 多条件筛选界面DropDownMenu使用总结