线段树学习—初级基础操作
//这篇博客是不完整的,现在的知识储备,貌似只能写一些基础的应用的 首先的话,来谈下自己对线段树的认识: 线段树可以解决区间加法的问题,比如说,最大值,最小值,区间和的问题, 但是不可以解决不符合区间加法的问题,比如说众数问题。 在网上看了很多版本的线段树,看到了很多的结构体类型的线段树。个人感觉结构体类型的线段树 很好理解,自己觉得的话,线段树主要运用了二分和分治的思想,求一个区间的最大值, 分为两个区间的最大值进行比较,区间和也是先求部分区间的和在求整体。 然后就是运用了二叉树的优点,使得查找时间为logn级别, 修改的话可以分为单点更新和区间更新。区间更新的话需要用到懒惰标记来降低复杂度。 网上其他博客的代码,感觉很好,但是自己敲一遍还是好的。 建树代码: const int maxn = 100005 ; int a [ maxn ] , t [ maxn << 2 ] ; //a为原来区间,t为线段树 void Pushup ( int k ) { //更新函数,这里是实现最大值 ,同理可以变成,最小值,区间和等 t [ k ] = max ( t [ k << 1 ] , t [ k << 1 | 1 ] ) ; } //递归方式建树 build(1,1,n); void build ( int k , int l , int r ) { //k为当前需要建立的结点