Segment Tree-线段树学习
1.指针版本:http://www.cnblogs.com/shuaiwhu/archive/2012/04/22/2464583.html
2.数组版本:http://www.cnblogs.com/Mu-Tou/archive/2011/08/11/2134424.html
其实线段树的模板不好给出,因为其实稍稍改变某个结构或者你需要的功能不一样的话,基本就会变,当然啦,线段树的基本建立都是一样的。
要注意这么个思想:
递归——线段树的建立以及更新查询等操作最喜欢的就是递归,特别是当你对一个区间二分后再进行判断的时候.
线段树的建立:
如果 left = right ,那么就等于递归结束,到达 [ n , n ] 的情况 .
否则就一分为 [ left , mid ] [ mid+1 , right ] 进入下一层(2n , 2n+1).
线段树的更新 :自上而下
线段树的查询 :自上而下
...
线段树的删除 :自上而下
对线段树的操作还是蛮多的,我还在慢慢学习中...
#define maxn XXX
struct line
{
int left,right ;
random; //这个就是核心吧,如果说left和right是基本的话,random是什么决定了线段树的功能
}a[maxn*4];
void buil ( int l , int r , int n )
{
int mid ;
a[n].left = l ;
a[n].right = r ;
if( l == r ) {
random operate;
return ;
}
mid = ( l + r ) / 2 ;
buil( l , mid , 2*n ) ;
buil( mid+1 , r , 2*n+1 ) ;
random operate...
}
delete:(对指针版的尤其重要)
题目链接:
一、最简单型,模板迹象严重
hdu1166 —— 建立 + 单点改变 + 区间求和 (random为区间和)
hdu1754 —— 建立 + 单点改变 + 区间极值 (random为区间极值)
hdu1394 —— 建立 + 单点改变 (逆序数的线段树求法)
hdu2795 —— 建立 + 单点改变 + 区间极值
poj2828 —— 建立 + 单点改变 + 区间极值(如何处理插队问题,逆序思想,十分经典)
poj2886 —— 建立 + 区间查询 + 单点改变 (random域为空位,学会独立思考,独立解决)
现在单点改变已经告一段落了,接下来的学习会进入lazy标记域,这会有一个很大提升