线段树
文章平均质量分 85
cscoder
这个作者很懒,什么都没留下…
展开
-
POJ3264:Balanced Lineup
http://poj.org/problem?id=3264初次使用线段树解题,题目意思很清楚,查询区间[p ,q]中的最小数与最大数,然后输出二者之差。采用线段树解决,问题要简单的多,建线段树,然后插入,查询即可。在设计节点的时候根据题意除了要包含基本的元素外,还要包含该段元素中最小的,最大的。程序如下:#include#include#includeusing names原创 2012-04-13 15:34:47 · 314 阅读 · 0 评论 -
hdu 3627 Giant For
Giant For线段树+离散化。离线处理,由于查询的时候我们需要找到所有满足条件的结果中行最小且列最小的。我们以行建树,然后将行对应的列中的值有set保存下来。首先将数据读入,然后将行从大到小进行排序,维护一个区间中的列最大的值。添加与删除操作很相似,一个是相当于将点的标记为1,另一个就是将标记置为0,所以只需要1个update函数就可以了。然后查询的时候很简单,我们只需要找到行最小的,并且原创 2012-10-03 23:53:39 · 517 阅读 · 0 评论 -
POJ 3667 Hotel
Hotel线段树:区间合并。首次写区间合并,开始的时候没有想明白怎么做。看了别人的解题报告,终于明白了操作的各种过程。其实与前面的线段树题目没什么太大的区别。主要是在线段树节点保存的值上多增加了一些。首先看节点域:struct Tree{ int l , r , lans , rans , mans , f ;}一共五个变量,l,r的含义与之前相同,为该区原创 2012-08-31 20:02:38 · 410 阅读 · 0 评论 -
CSUOJ 1258 维护序列
维护序列线段树题目。此题的更新必须要更新到叶节点,否则的话,会出现错误。对于一个int范围内的数字,更新若干次(最多32次)后必然会变成0,那么此时在更新就没有意义了。那么我们可以用lazy标记,当某个区间的数字全部变为0后,我们将这个区间做上标记。那么这个区间就不可能在被更新,这样就可以提高效率,减去不必要的更新。对于将一个数字的二进制位最低位1变成0,在做树状数组题目的时候我们常用一个lo原创 2012-08-08 13:49:12 · 469 阅读 · 0 评论 -
POJ 3277 City Horizon
POJ 3277 City Horizon线段树+离散化+矩形面积。初次写这类题目,用了很长时间才搞明白其中的很多问题。这个题目是线段树+离散化+矩形面积中比较简单的了。首先如何求解矩形面积。求解矩形面积很简单:直接套用公式:长乘以宽,可是在这里矩形与矩形间有重叠,该怎么处理呢?矩形与矩形相交的边,我们可以找出来,那么求解矩形面积不就好求了么。由于本题中有一边是x轴,所以我们只要处理出原创 2012-08-02 23:40:39 · 384 阅读 · 0 评论 -
POJ 1151 Atlantis
POJ 1151 Atlantis线段树+离散化+矩形面积求并。做完了前面比较简单的 POJ3277,再做这一题就知道怎么下手了。开始的时候我只打印一个算的面积,然后很果断的wrong了,之后就没想这道题目了,当我做其它题目的时 候,突然想起来,我没按照格式输出啊(狂晕)。然后我又将输出结果改了一下,一交PE了。哇咔咔,忽略了空行,。加了空行就过了,。 说下这个题目的思路,先离散化原创 2012-08-03 15:40:05 · 462 阅读 · 0 评论 -
POJ 2528 Mayor's posters
Mayor's posters给定n条线段,线段端点的范围从1-10000000,范围比较大,如果直接用线段树,肯定会爆内存。需要离散化操作,这是我的首个离散化题目,由于边只有100000左右也就是说对应的点只有200000个左右,如果只考虑这200000个点就可以保证不会爆内存了。我们将输入的边,离散化,将对应的坐标重新分配到 1 ~ 2 * n上。然后再按照线段树的操作进行插入与查询。代码原创 2012-07-12 11:01:44 · 470 阅读 · 0 评论 -
POJ 4047 Garden
POJ 4047 Garden线段树题目,很简单。需要预处理一下,树的节点中存储的元素为区间的两个端点,然后该段中最大的值,还有延迟标记。预处理的时候先求出所有长度为k的序列的长度,然后建树。具体的程序如下:开始的时候忽略了测试例子数,所以一直runtime error。/*ID : csuchenanPEOG: D GardenLANG: C++*/#include#inc原创 2012-06-16 21:33:33 · 366 阅读 · 0 评论 -
hdoj 2795 Billboard
Billboard题目意思很简单,给一个面积为h*w的板子,每次选择一个最上且最左的区域贴上一张纸1*wi,求每次贴的行。每次找出行中保留面积能够满足纸的面积的即可。如果直接用数组模拟的话,肯定会超时。这个题目可以用线段树做。看题的时候,发现h比较大,开数组肯定会超内存。分析一下,发现有n次插入,我们可以假设每次都只能在新的一行中插入,在极限数据下,也只需要4*200000的空间,这样肯定不会原创 2012-05-24 14:38:40 · 387 阅读 · 0 评论 -
hdoj 1698 Just a hook!
Just a hook!题目意思很清楚,就是对某个区间的数全部更改为某个值。只进行一次查询。用线段树来实现。由于要不断的更改,所以我们这里采用lazy思想,即标记延迟。在更改的时候,并不更改到每个节点,而只是更改到某个区间上,用一个变量记录更改量。当进行下次更改的时候,在更改。程序如下:#include#define MAXN 100005struct Node{ int l原创 2012-05-23 19:59:06 · 403 阅读 · 0 评论 -
POJ 2352 Stars
Stars题目意思很简单,就是查找每个度的个数,度被定义为:一个点其左下方所有点的个数。由于输入的时候已经为我们排好序,这样考虑,每次插入一个点的时候,我们只需要考虑其左侧的点的个数,而忽略它们的高度问题。这是因为输入的时候已经按高度排序了,这样就可以直接用线段树查找。程序如下:#include#include#define MAXN 32010struct Node{ in原创 2012-06-11 12:18:12 · 324 阅读 · 0 评论 -
POJ 2777 Count Color
Count Color简单的线段树,对区间染色查询,和zoj1610类似,代码如下:#include#include#define MAXN 100000struct Node{ int l ; int r ; int c ;}tree[4*MAXN] ;int ncount[35] ;int l ;int t ;int o ;void build(int l原创 2012-06-09 22:55:44 · 354 阅读 · 0 评论 -
Count the colors
Count the colors查询某种颜色出现的段数,用线段树解。首次用线段树解该类题目。对于查询的时候,只不过需要注意,每次标记一下访问过的区间,它的颜色是不是和现在正在查询的区间的颜色视相同的,如果是则不比统计,因为它们是连续的一段,否则的话就要累加,然后记录该点的颜色。在递归的时候,总是先后查询相邻区间的颜色的值,故而采用此种方式能解决对应的线段的连续性问题。然后需要注意线段的最小区间原创 2012-06-09 21:01:37 · 430 阅读 · 0 评论 -
HDUOJ Minimum Inversion Number
Minimum Inversion Number题目意思很明确,每次将序列的第一个元素放到序列尾,产生一个新序列,求出序列中逆序对的个数,一共有n个这种序列,输出其中最小的逆序对个数。先用线段树求解出最原始序列的逆序对的个数,然后递推。对原始序列的逆序对的个数,在节点信息中添加一个某个区间元素的个数的变量,每次加入新元素的时候,统计当前情况下,其前面的比它大的元素的个数,然后在将元素插原创 2012-05-16 14:34:14 · 305 阅读 · 0 评论 -
hduoj 1754 I Hate it
I Hate it对于区间的值进行修改与查询最大,采用线段树解决。用一个变量来记录某个区间的最大值,同时每次更新后,需要递归回调每个区间的子区间的最大值。用于更新父节点的最大值。程序如下:/*ID: csuchenanPROG: hduoj 1754 I hate itLANG: C++*/#include#include#include#define max(a ,原创 2012-05-15 21:50:02 · 488 阅读 · 0 评论 -
hduOJ 1166: 敌兵布阵
http://acm.hdu.edu.cn/showproblem.php?pid=1166题目意思很明显,需要多次查询,多次进行修改操作。用线段树做,由于每次只对一个点进行修改,所以数据结构中只需要包含和项,而不必要包含修改标志。代码如下:/*ID: csuchenanPROG: hduoj 1166 敌兵布阵LANG: C++*/#include#includ原创 2012-05-15 19:47:55 · 538 阅读 · 0 评论 -
POJ3468:A Simple Problem with Integers
http://poj.org/problem?id=3468 线段树的第二题,这题是关于区间元素的插入以及求和,用线段树在适合不过了。遵循线段树的解题一般情况,先创建线段树,然后不断的插入元素,然后根据题目要求,对元素进行修改以及查询。这里主要说一说修改操作和查询操作。这两个操作都采用Lazy办法,也就是在修改或者查询的时候,对于查询或者修改区间相同的时候,不必急于修改其子原创 2012-04-13 21:21:40 · 320 阅读 · 0 评论 -
HDU 4302 Holedox Eating
Holedox Eatinghdu 4302有一个[0,l]区间,有一只毛毛虫,初始位置在0,现在又两种操作操作0 x 代表在x点放一块蛋糕,操作1代表毛毛虫要吃一块蛋糕:如果有蛋糕,那么毛毛虫将走到距离其最近的位置吃一块蛋糕。如果在其两边有两个距离其等距的蛋糕,那么毛毛虫将沿上次走的方向移动。如果没有蛋糕那么毛毛虫将待在原位置不动。现在给定M个操作,问毛毛虫的移动距离。做法:1.原创 2012-10-20 17:17:17 · 546 阅读 · 0 评论