随笔分类 - 数据结构 - 线段树
摘要:线段树(interval tree) 是把区间逐次二分得到的一树状结构,它反映了包括归并排序在内的很多分治算法的问题求解方式。上图是一棵典型的线段树,它对区间[1,10]进行分割,直到单个点。这棵树的特点是:1. 每一层都是区间[a, b]的一个划分,记 L = b - a2. 一共有log2L层3. 给定一个点p,从根到叶子p上的所有区间都包含点p,且其他区间都不包含点p。4. 给定一个区间[l...
阅读全文
摘要:Tunnel Warfare题型:线段树描述:n个村子排成一条线,两两相邻,1.摧毁村子c,2.修复上一次摧毁的村子,3.问与村子c直接或间接相通的村子数思路:对节点的操作,增加lx,rx域,表示区间内最左边被摧毁的村子,和最右边被摧毁的村子,s表示区间内摧毁的村子总数。重点在count(),统计相连村子数操作。根据父结点的两个孩子结点的 s 值,讨论各种可能情况。[代码]完整代码
阅读全文
摘要:Hotel题型:线段树(设计并维护复杂域)描述:旅店登记,1.找一段最靠前的连续w个空房间;2.退订[x,x-d+1]段的房间。思路:1. 域的设计struct Seg { int l, r; int lx, rx, mx; char cv;};lx :左端连续空房间数rx: 右端连续空房间数mx: 连续最大空房间数cv : = 0,全空, = 1 全满, = -1 非空非满。2. 域的维护开房:...
阅读全文
摘要:Billboard题型:线段树描述:板子h*w上贴1*w0的广告,从左上角贴起,询问广告所在的row。思路:将h分段,结构中增加w域,保存区间[a,b]所以行剩余可贴的最大量。代码
阅读全文
摘要:题型:线段树描述:长为L的报栏上按顺序贴广告[a,b],统计不同的广告数。思路:数据要离散化处理,然后区间的更新和统计。离散化方法参考:matrix67离散化代码参考:笑风生代码
阅读全文
摘要:A Simple Problem with Integers题型:线段树,区间的修改+区间统计描述:1~n个数,[a,b]区间内的每个数加上C,询问区间[a,b]的数字和。思路:用两个域:v, add来维护,v为区间和,add为区间增量。区间的修改过程,回溯时增加了对父节点v域的修改;区间的统计过程,需要将父节点的增量add域计算进去。[代码]区间的修改[代码]区间的统计[代码]
阅读全文
摘要:PKU 2777题型:线段树描述:跟长为L的木棒的[a,b]段涂颜色,问[a1,b1]区间的不同颜色数。思路:线段树的区间修改,“父节点控制子节点的思想”,当left = t[k].left && right = t[k].right 时更改 color域,并返回,不再修改其子节点的color值。color = 0 表示当前区间有多种颜色,如果 [left,...
阅读全文