数据结构------线段树2:单点修改与区间询问
上一次我们讲到线段树的概念和建树,今天,我们来讲线段树的单点修改与区间询问。
1.单点修改
单点修改会改变它所在子树的节点,当你修改了叶节点后,一定要更新其祖先的值。
code:
void up(int p){ s[p]其实这就是一个模板,记一下,对你有好处!= s[p * 2] + s[p * 2 + 1]; }//向上更新节点 void modify(int p, int l, int r, int x, int v){//p节点编号,l,r区间,v修改值 if (l == r){ s[p] += v; return; } int mid = (l + r) / 2; if (x <= mid) modify(p * 2, l, mid, x, v);//左子树 else modify(p * 2 + 1, mid + 1, r, x, v);//右子树 up(p); }
2.区间询问
一般来说,区间询问是以这样的形式出现滴:
给定一个区间 [ l , r ] ,求区间的和。
上图QAQ
线段树:我又回来啦!
此时,询问 [ 3 , 6 ]的最小值。
先找3所在的区间 [ 1 , 5 ] ,接着在搜左子树,右子树。直到搜到3。
之后在3~6的区间中,[ 4 , 5 ]是一个节点,直接返回区间最小值,不必往下搜,再到右子树上去搜6,找到总区间最小值。
1 int query(int p, int l, int r, int x, int y) 2 { 3 if (x <= l && r <= y) return s[p]这要用到之前的修改;//若该结点被查询区间包含 4 int mid = (l + r) / 2, res = 0; 5 if (x <= mid) 6 res += query(p * 2, l, mid, x, y); 7 if (y > mid) 8 res += query(p * 2 + 1, mid + 1, r, x, y); 9 return res; 10 }
这就是线段树的单点修改与区间查询
自己背一背模板,rp++。
- [CodeVS1081]线段树练习2(区间修改+单点询问)
- hdu 1166 线段树 单点修改 + 询问区间求和 (线段树模板)
- HDU-1754 I Hate It (线段树裸题 splay模板 单点修改 区间询问最大值)
- 【数据结构】【线段树】单点修改区间查询
- 【HDU4348】To The Moon-主席树(可持久化线段树)区间修改+区间询问
- 线段树(区间修改,单点查询)
- UVA - 12299 RMQ with Shifts (线段树:单点修改,区间查询)
- HDU1166 线段树 单点修改、区间查询
- hdu 1754 线段树单点修改+区间查询
- 敌兵布阵 HDU - 1166 (线段树单点修改区间求和模板)
- HDU 4893(Wow! Such Sequence!-线段树单点修改+区间求和+改为最近Fib数)
- (HDU 1754)I Hate It 线段树区间查询入门,单点修改
- 【codevs 1081】线段树练习2(单点查询+区间修改)
- A Simple Problem with Integers(线段树+区间修改+区间询问模板)
- BZOJ-1036: [ZJOI2008]树的统计Count (树链剖分 线段树 单点修改 区间查询 入门题)
- 【线段树】单点求值+区间修改
- hdu1754 I Hate It(线段树单点修改,区间最值)
- kb-07专题--线段树-01-单点修改,区间查和
- HDU1166_敌兵布阵_线段树单点修改区间查询
- 2017西安交大ACM小学期数据结构 [分块,区间修改,单点查询]