数据结构--线段树
focus_best
这个作者很懒,什么都没留下…
展开
-
HDU 2871 Memory Control(线段树:区间合并)
HDU 2871 Memory Control(线段树:区间合并)http://acm.hdu.edu.cn/showproblem.php?pid=2871分析: 首先分析题目中能进行的几种操作:1. Reset: 所有内存单元置02. New x:申请一块包含连续x个单元的空闲内存块3. Freex: 释放包含x号单元的(已被占用)内存块原创 2014-03-29 16:43:31 · 1040 阅读 · 0 评论 -
POJ 2528 Mayor's posters(离散化+区间set线段树)
POJ 2528 Mayor's posters(离散化+区间set线段树)分析: 首先题目的区间范围高达1000W,如果直接计算可能超内存且超时间。所以需要离散化。 离散化一:比如对于如下区间集合,[1,1000],[500,2000],[1500,2500].那么把所有区间端点1,500,1000,1500,2000,2500离散化后就是1,2,3,4,5,原创 2014-03-26 19:14:56 · 1172 阅读 · 2 评论 -
UVA 1400 "Ray, Pass methe dishes!"(线段树,区间合并)
UVA 1400 "Ray, Pass methe dishes!"(线段树,区间合并)分析: 本题比较复杂,详解见:刘汝佳训练指南P201 建立一棵线段树,每个节点维护下面3种信息max_sub,max_prefix和max_suffix,分别表示最大连续和,并保存相应的坐标信息x[],y[],p[],s[].然后对于一个查询[20,50]区间的最大连续和,由原创 2014-03-26 23:33:01 · 1372 阅读 · 0 评论 -
POJ 3225 Help with Intervals(线段树:区间置0/1,区间异或)
POJ3225 Help with Intervals(线段树:成段更新,开闭区间)分析:找到几个小BUG,直接AC了,还是需要写出自己的所有思路,才比较好写代码. 首先这道题目要处理区间,所以我们在线段树的各个节点用0表示不包括,1表示包括,-1表示子节点中既有包括又有不包括.下面分析对应的5种操作,假设T表示的区间是[l,r]:U T: [l,r]区间置1I T: [0,l原创 2014-03-27 13:57:00 · 3551 阅读 · 0 评论 -
POJ 1436 Horizontally VisibleSegments(线段树:区间覆盖染色)
POJ 1436 Horizontally VisibleSegments(线段树:成段更新+区间开闭)分析:1. 首先读入所有的线段,然后按x轴坐标从小到大排序,然后我们一次处理每条线段,用一个二维矩阵mark[i][j]保存第i条线段和第j条线段之间的关系.(如果相互可以看到,则mark为true,否则为false). 2. 下面的问题是如果求出任意两线段之间的可见原创 2014-03-27 19:26:25 · 1500 阅读 · 1 评论 -
POJ 2777 Count Color(线段树:区间覆盖)
POJ 2777 Count Color(线段树:成段更新)分析:本题是POJ 1436的弱化版本:http://blog.csdn.net/u013480600/article/details/22313189 首先本题的区间是一个一个的整数,所以不用乘2考虑开区间闭区间的问题了.所以这里的线段树维护一个color信息,其中color>0表示节点所指的区间都有某种颜色原创 2014-03-27 22:14:07 · 1373 阅读 · 1 评论 -
POJ 2991 Crane(线段树:维护向量+计算几何)
POJ 2991 Crane(向量旋转+线段树_成段更新)分析: 首先一个向量(x,y)逆时针绕起点旋转rad度后得到的向量为:newx = x*cos(rad)-y*sin(rad) newy = x*sin(rad)+y*cos(rad)然后我们要知道另外一个事实:如果一条折线由多个向量构成,那么这条折线段的终点坐标一定为起点+向量1+向量2+..+向量n的结果原创 2014-03-28 02:13:00 · 1629 阅读 · 1 评论 -
POJ 3468 A Simple Problemwith Integers(线段树:区间add,区间查询)
POJ 3468 A Simple Problemwith Integers(线段树:区间add,区间查询)分析:基本题型。熟练代码模板。AC代码:1797ms//POJ 3468 区间add,区间查询#include#include#includeusing namespace std;//每当有add加到i节点上,直接更新i节点的sum.//也就是说如果要查询区间[1原创 2014-03-26 19:16:58 · 1199 阅读 · 0 评论 -
线段树
线段树注意:线段树维护的元素 与线段树的节点不一样。线段树整体维护的是从1到n下标的元素(当然也可以维护0到n-1号元素或者其他任意一个区间的元素)但是拥有1到大约3*n的树节点,每个树节点维护一段[L,R]的区间内所有的元素信息(没有0号树节点,因为如果你要指定0号树节点为根的话,那么i号树节点的左右儿子就不是i*2节点和i*2+1节点了)。而树节点中每个节点i都有它需要维护的区间[原创 2015-03-20 11:04:33 · 3960 阅读 · 0 评论 -
POJ 3667 Hotel(线段树:区间覆盖,维护最大连续子区间)
POJ 3667 Hotel(线段树:区间合并)分析: 首先本题类似于UVA1400 ,所有区间合并类的线段树基本都需要维护3类信息:最大区间,最大前缀,最大后缀. 维护一棵线段树,该线段树每个节点维护信息:在该节点所代表的区间内的覆盖情况cover: 为0时表示没有被覆盖,为1时表示被覆盖了,为-1时表示子节点中既有被覆盖的也有没被覆盖的.最长连续区间长度原创 2014-03-28 16:46:52 · 2112 阅读 · 0 评论 -
HDU 1698 Just a Hook(线段树:区间set,区间查询)
HDU 1698 Just a Hook(线段树:区间set,区间查询)分析:线段树区间set基本操作,详情看刘汝佳训练指南。//HDU 1698 线段树 区间set 区间查询#include#include#includeusing namespace std;#define lson i*2,l,m#define rson i*2+1,m+1,rconst int MA原创 2014-03-26 19:18:05 · 1250 阅读 · 0 评论 -
HDU 1542 Atlantis(线段树:扫描线)
HDU1542 Atlantis(线段树:扫描线)题意:二维平面有n个平行于坐标轴的矩形,现在要求出这些矩形的总面积. 重叠部分只能算一次.分析: 首先假设有下图两个矩阵,我们如果用扫描线的方法如何计算它们的总面积呢?首先我们将矩形的上下边分为上位边(即y坐标大的那条平行于x轴的边),和下位边(y坐标小的平行于x轴的边).然后我们把所有矩形的上下位边按照他们y坐标原创 2014-03-30 01:46:38 · 9510 阅读 · 14 评论 -
HDU 3265 Posters(线段树:扫描线)
HDU 3265 Posters(线段树:扫描线)http://acm.hdu.edu.cn/showproblem.php?pid=3265分析: 这道题目WA了我很久,我一开始想用之前的模板直接套用的,不过有很多细节没处理好,结果捷径没走成还是错漏百出. 首先本题与HDU1542很相似,可以用几乎一样的基本方法解决.http://blog.csdn.原创 2014-03-30 21:02:11 · 1129 阅读 · 0 评论 -
UVA 11992 Fast MatrixOperations(线段树)
UVA 11992 Fast MatrixOperations(线段树)http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=18697分析:详解见刘汝佳 训练指南P207 可以看到题目中的矩阵最多20行,但是却最多有100W元素,所以可以想到对于矩阵每行维护一棵线段树就行. 线段树维护的信息:有原创 2014-04-01 13:04:43 · 1187 阅读 · 0 评论 -
HDU1540 Tunnel Warfare(线段树:维护最大连续子串)
HDU1540 Tunnel Warfare(线段树:区间合并)http://acm.hdu.edu.cn/showproblem.php?pid=1540分析: 首先先来分析题目中的3种操作:1.D x: 该操作就是单点更新2.Q x: 该操作可以分解为查区间[1,x]的最大连续0后缀长L和区间[x,n]的最大连续0前缀长R,则R+L-1即为所求.有关前缀查询和后原创 2014-03-29 19:18:43 · 1738 阅读 · 1 评论 -
HDU 3308 LCIS(线段树:单点更新,求最大连续子串)
HDU 3308 LCIS(线段树:单点更新,区间合并)分析: 首先题目中找的递增序列是严格增加的,如果有7,7这样的序列不算递增.其次本题是单点更新,所以不用PushDown,只用PushUp就行. 线段树维护信息:val(表节点的值,只有子节点有用,这个信息也可以不维护的),sub(最长上升子序列的长度),pre(最长上升前缀的长度),suf(最长上升后缀的长原创 2014-03-28 18:58:10 · 2473 阅读 · 0 评论 -
HDU 3397 Sequence operation(线段树:成段更新,查询连续目标子串长度)
HDU 3397 Sequence operation(线段树:成段更新,区间合并)分析:注意在总的query地方可以不用编写查询前缀和后缀的函数,特别注意优化二的地方. 1.本题有点类似于POJ3225:http://blog.csdn.net/u013480600/article/details/22284341也是同时有cover操作和异或操作,但是这里用异或标记原创 2014-03-28 22:29:58 · 1071 阅读 · 0 评论 -
HDU 1754 I Hate It(线段树:单点替换,区间最值)
HDU 1754 I Hate It(线段树:单点替换,区间最值)分析:依然是线段树的基本操作.详解:http://www.notonlysuccess.com/index.php/segment-tree-complete/AC代码: 515ms//HDU1754#include#include#includeusing namespace std;const原创 2014-03-24 23:42:06 · 1203 阅读 · 0 评论 -
HDU 2795 Billboard(线段树:找到线段树中>=给定值的第一个元素位置 并 更新该点)
HDU 2795 Billboard(线段树:单点更新,区间查询)分析: 首先由于有n(n 注意: 如果h比n小,那么线段树的节点总数定为h个,否则定位n个.如果wi>w,那么直接输出-1. 现在我们依次读入wi,找到能放下wi的序号最小的线段树叶节点,然后更新线段树即可. 其中线段树中节点维护的信息是:本节点控制的区间[L,R原创 2014-03-25 11:55:15 · 1394 阅读 · 0 评论 -
POJ 2828 Buy Tickets(线段树:查找并更新从左到右第i个1)
POJ 2828 Buy Tickets(线段树,逆推)分析: 本题的解法类似于POJ 2182:http://blog.csdn.net/u013480600/article/details/21574467 首先对于这种一个一个元素插入队列的例子,我们可以用链表来实现,插入时间为O(1),但是每次找到正确的插入位置pos,需要的时间是O(n),那么如何快原创 2014-03-25 19:38:14 · 1200 阅读 · 0 评论 -
HDU 1166 敌兵布阵(线段树:点更新,区间求和)
HDU 1166 敌兵布阵(线段树:点更新,区间求和)分析:线段树基本应用.参考资料:http://www.notonlysuccess.com/index.php/segment-tree-complete/AC代码:203ms#include#includeusing namespace std;#define lson i*2,l,m#define rson原创 2014-03-24 23:15:26 · 1262 阅读 · 0 评论 -
HDU 1394 Minimum Inversion Number(线段树:单点更新,区间求和)
HDU 1394 Minimum Inversion Number(线段树:单点更新,区间求和)分析: 首先对于读入的每个a[i],执行a[i]++操作.使得序列变成1到n之间.首先利用线段树求出初始序列a1,a2…an的逆序数ans.类似于树状数组对逆序的求法.详解:http://blog.csdn.net/u013480600/article/details/21原创 2014-03-25 00:29:41 · 1040 阅读 · 0 评论 -
HDU 1828 Picture(线段树:扫描线)
HDU 1828 Picture(线段树:扫描线)http://acm.hdu.edu.cn/showproblem.php?pid=1828分析: 本题和HDU1542类似,详解请见: http://blog.csdn.net/u013480600/article/details/22548393下面继续拿HDU1542的两个矩形为例分析:不过由于本题求得是周原创 2014-03-30 13:21:09 · 1617 阅读 · 2 评论 -
POJ 2886 Who Gets the MostCandies?(线段树+模拟+求数的约数个数)
POJ 2886 Who Gets the MostCandies?(线段树+模拟+求数的约数个数)分析: 首先建立一棵线段树,其每个叶节点都是1(代表每个孩子都在圈中,如果第i个孩子不在圈中,那么就令第i个叶子(不一定编号为i)sum=0)。分析题中的例子:4 2Tom 2Jack 4Mary -1Sam 1 假设我们第一个出去的孩子是原创 2014-03-26 00:02:04 · 1152 阅读 · 0 评论