两种线段树问题
这几天做了一些线段树,发现线段树问题还是主要分为两大类的。
第一类是普通的区间信息维护,查询
大多数问题属于这类,我们平时学习线段树的例题也都以这类为主。
当然,具体还包含像成段更新,打标记等等很多种,但是这类线段树都是遇到完整区间就返回值,利用左右两个子区间的信息维护父亲区间的信息。
这种题目很多,也很常见。
而另外一类我个人接触的比较少。这种线段树问题不用左右两个儿子维护父亲,也不用整段区间返回。相反,这类问题是利用线段树维护的信息进行二分查找。对于一个大区间,选择左儿子或者右儿子只在这一个儿子内查找。(大概就是所谓的线段树自顶向下的类型)
举一些例题:
POJ 2828 这个题需要查询一段区间内的第i个空是谁。我们维护一个区间内有多少个空,如果一个大区间的左儿子的空数<=i ,就在左儿子种查询,反之就在右儿子种查询。
HDU2795 这个题需要查询一段区间内第一个大于等于x的数是谁。我们维护一段区间的最大值。如果最大值小于x,就返回没有,否则看左右儿子的最大值,选择其中一个递归向下查找。
其他例子待补充。。。
查询一段区间内第一个大于等于x的数是谁这种操作比较典型,很多操作都可以归结为此类,对于这种问题,在线段树上二分查找是很高效又好写的方法。
wsc500原创,转载请注明出处。请注明 出自http://www.cnblogs.com/loveidea/