线段树

来源:互联网 发布:淘宝 卓诗尼 编辑:程序博客网 时间: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]区间内元素的总和






原创粉丝点击