线段树
来源:互联网 发布:淘宝 卓诗尼 编辑:程序博客网 时间:2024/06/16 07:34
线段树——代码实现(建树)
•建立一棵线段树,并记录原数组信息
void build(int id,int l,int r){tree[id].left=l; tree[id].right=r;if (l==r){tree[id].sum=a[l];tree[id].max=a[l];}else{int mid=(l+r)/2;build(id*2,l,mid);build(id*2+1,mid+1,r);tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;tree[id].max=max(tree[id*2].max,tree[id*2+1].max;}}
如果原数组从a[1]~a[n],调用build(1,1,n)即可
线段树——代码实现(更新)
•更新某个点的数值,并维护相关点的信息
void update(int id,int pos,int val){if (tree[id].left==tree[id].right){tree[id].sum=tree[id].max=val;}else{int mid=(tree[id].left+tree[id].right)/2;if (pos<=mid) update(id*2,pos,val);else update(id*2+1,pos,val);tree[id].sum=tree[id*2].sum+tree[id*2+1].sum;tree[id].max=max(tree[id*2].max,tree[id*2+1].max)}}
若更新a[k]的值为val,调用update(1,k,val)即可
线段树——代码实现(查询)
•查询某区间内元素的和或最大值(以总和为例)
void query(int id,int l,int r){if (tree[id].left==l&&tree[id].right==r)return tree[id].sum; //询问总和else{int mid=(tree[id].left+tree[id].right)/2;if (r<=mid) return query(id*2,l,r);else if (l>mid) return query(id*2+1,l,r)else return query(id*2,l,mid)+query(id*2+1,mid+1,r);}}
调用query(1,l,r)即可查询[l,r]区间内元素的总和
阅读全文
0 0
- 线段树?线段树!
- 线段树?线段树!
- 线段_线段树
- 线段_线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- 线段树
- java-无法新建servers的问题
- 如何写SysV服务管理脚本
- 设计模式 单例模式
- 【翻译】VTK 8.0.0
- 记:为何我设置了session为永久保存,但是并没有什么卵用
- 线段树
- GMS认证送测前自检项小结
- Toolbar详解 · Material Design Part 2
- Redis数据类型--Hash(哈希表)
- myeclipse安装svn插件无法显示问题解决
- codeblocks常用快捷键和设置
- tomcat与nginx的不同
- bzoj 5041: LWD的降临
- Golang设计模式之单例模式