两种线段树问题

这几天做了一些线段树,发现线段树问题还是主要分为两大类的。

第一类是普通的区间信息维护,查询

大多数问题属于这类,我们平时学习线段树的例题也都以这类为主。

当然,具体还包含像成段更新,打标记等等很多种,但是这类线段树都是遇到完整区间就返回值,利用左右两个子区间的信息维护父亲区间的信息。

这种题目很多,也很常见。

而另外一类我个人接触的比较少。这种线段树问题不用左右两个儿子维护父亲,也不用整段区间返回。相反,这类问题是利用线段树维护的信息进行二分查找。对于一个大区间,选择左儿子或者右儿子只在这一个儿子内查找。(大概就是所谓的线段树自顶向下的类型)

举一些例题:

POJ 2828 这个题需要查询一段区间内的第i个空是谁。我们维护一个区间内有多少个空,如果一个大区间的左儿子的空数<=i ,就在左儿子种查询,反之就在右儿子种查询。

HDU2795 这个题需要查询一段区间内第一个大于等于x的数是谁。我们维护一段区间的最大值。如果最大值小于x,就返回没有,否则看左右儿子的最大值,选择其中一个递归向下查找。

其他例子待补充。。。

查询一段区间内第一个大于等于x的数是谁这种操作比较典型,很多操作都可以归结为此类,对于这种问题,在线段树上二分查找是很高效又好写的方法。

posted @ 2014-08-08 20:52  wsc500  阅读(467)  评论(0编辑  收藏  举报