线段树

时间:2019-08-28
本文章向大家介绍线段树,主要包括线段树使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
//单点修改、区间查询
int
t[maxn]={0}; void build_tree(int node,int start,int end) { if(start==end) { t[node]=a[start]; return ; } int left=2*node+1; //左节点的坐标 int right=2*node+2; //右节点的坐标 int mid=(start+end)/2; build_tree(left,start,mid); //递归建树 build_tree(right,mid+1,end); t[node]=t[left]+t[right]; } void update(int node,int start,int end,int index,int val) { if(start==end) { a[index]=val; t[node]=val; return ; } int left=node*2+1; int right=node*2+2; int mid=(start+end)/2; if(index>=start&&index<=mid) { update(left,start,mid,index,val); } else { update(right,mid+1,end,index,val); } t[node]=t[right]+t[left]; } int query(int node,int start,int end,int L,int R) { //不在计算范围之内 if(R<start||L>end) return 0; //整块在计算范围内 else if(L<=start&&R>=end) return t[node]; //计算到叶节点 else if(start==end) return t[node]; int mid=(start+end)/2; int left=node*2+1; int right=node*2+2; int sumleft=query(left,start,mid,L,R); int sumright=query(right,mid+1,end,L,R); return sumleft+sumright; }

原文地址:https://www.cnblogs.com/wronin/p/11422441.html