线段树
文章平均质量分 77
sdj222555
这个作者很懒,什么都没留下…
展开
-
poj 2886 Who Gets the Most Candies?
N 个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 -A 个小孩。游戏将直到所有小孩都离开,在游戏中,第 p 个离开的小孩将得到 F(p) 个糖原创 2011-10-16 21:21:01 · 1753 阅读 · 0 评论 -
POJ 1151 Atlantis 矩形切割 || 线段树 扫描线
这道题的题意就是给出一些矩形,问这些矩形覆盖的面积,也就是矩形可能是相交的这道题由于数据量很小,所以可以按照将输入的坐标排序的方法进行分割矩形如下面的代码/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #in原创 2012-02-05 16:56:12 · 1750 阅读 · 0 评论 -
HDU 3607 线段树+DP
这题最裸的方法因该是O(n2)的。dp[i]=max(dp[j])+gi(1hj) 其中dp[i]代表的是前i下能拿的最多的钱。 但这个数据范围有点大,是10W 之多。 在hi > hj这个限制下,我们可以联想到,不就是找比hi小的高度中能获得的最多的钱的那个状态么,再由数据范围,容易联想到用线段树优化这个过程。那么就先把所有的高度都离散化,然后每次先进行查询,将比hi小的高度中钱最多的状态找出,原创 2012-04-13 10:31:17 · 818 阅读 · 0 评论 -
HDU 1823 二维线段树
题意就不赘述了。二维线段树,第一维是高度,第二维是活泼值, 然后建立树套树。/*ID: CUGB-wwjPROG:LANG: C++*/#include #include #include #include #include #include #include #include #include #include #include #incl原创 2012-04-13 20:33:30 · 1128 阅读 · 0 评论 -
POJ 2464 Brownie Points II 树状数组||线段树
这题不是一般的恶心人,简直就是个神题。参考了一个大牛的思路写了个树状数组版本的,不推荐用线段树,但是练练线段树也不错。http://hi.baidu.com/czyuan_acm/blog/item/af6fe8a9177f7ef51e17a2ea.html 这道题用二分也可以做的,这里介绍下树状数组的做法。首先有n个点,过每个点可以做x,y轴,把平面切成BL,原创 2012-03-14 15:44:15 · 1553 阅读 · 0 评论 -
HDU 3333 Turing Tree 线段树 or 树状数组
给出一组序列,问某个区间内序列的和,跟普通求和不同的是,要求值相同的元素只能算一次。首先看数据范围,就知道要离散化,不然没法标记某个数是否出现过。然后要对要查询的区间进行排序,按右端点进行排序。然后按顺序遍历点,如果该点的值以前出现过,就删掉以前的那个,然后插入该点,记录下这个值的位置。刚才已经对询问区间排序了,那么所有右端点在该点的区间都可以进行查询了。那么为什么要这么干呢。观察原创 2012-03-22 20:15:02 · 1338 阅读 · 0 评论 -
POJ 2182 Lost Cows 线段树 or 树状数组
这道题还是很经典的给出了一个序列,代表的是比该位置的牛靠前站的且序号比他小的牛的个数然后思想类似于2828,正序看的话,看不出有什么规律,但是逆序的话,就能看出当前序列的最后一头牛的编号是可以确定的,就相当于有一个队列,初始化全为1,有牛占了就把相应位置变为0,然后我们只管那些位置为1的地方,往里一头一头的塞牛,塞一头,能塞的地方就少一个,但是和之前塞过的就没关系了,这也符合题目中,只管比原创 2012-01-29 17:09:39 · 935 阅读 · 0 评论 -
UESTC 1712 Easy Problem With Numbers 线段树+扩展欧几里得求逆元
这题是今年四川省赛的E题, 如果懂逆元的话很容易想到做法,不懂的话就像我似的 沙茶了。四处求许久,求得神牛代码一份,思路一份,写了许久后最终得以A掉此题。题意就不再说了,如果你知道product是乘积的意思的话这题就不难理解附上神牛原版思路:如果这个题只有乘法,那么你肯定会做吧?线段树更新区间查找区间。那么有除法呢?当一个数x和m互质的时候,除以x可以改为乘以x的逆原创 2012-07-16 01:45:20 · 1906 阅读 · 1 评论 -
HDU 4351 Digital root 线段树 区间合并
看了解题报告后说有一种离线不用线段树的做法,表示不解只会用线段树做因为题目中所查询的区间,是所有的子区间的结果的并。所以区间合并就很必要了。每个结点,记录这个区间的和的数根, 记录本区间内从左端点为端点往右的连续区间出现的数根,从右端点为端点往左的连续区间出现的数根,以及整个区间能出现的数根比赛的时候狂WA一下午。最后发现查询的时候左右区间合并有问题,查询的时候也需要像push原创 2012-08-10 03:09:30 · 1176 阅读 · 0 评论 -
POJ 4047 Garden 线段树
这题只要想出怎么建树就简单了吧。他问的是连续k个值最大的是多少就可以用1~k之和,2~k+1之和,3~k+2之和.......做为结点。然后就发现,变成了简单的区间更新和区间查询问题了。#include #include #include #include #include #include #include #include #include #define e原创 2012-08-14 02:22:38 · 1194 阅读 · 0 评论 -
HDU 4366 树转化为连续序列 线段树
这题跟 http://poj.org/problem?id=3321 这题的转化形式基本一样本题给的是一棵树。 然后找子孙中能力值大于父节点并且忠诚最高的。由于树的结构不好搞线段树,所以要映射到一个连续序列上搞,把这个结点的子树都能映射到一个连续区间上就好办了。很常见的套路就是DFS时间戳,记录进入结点的时间戳和出结点的时间戳,两个时间戳之间的都是这个结点的子孙结点了。而我们要找能原创 2012-08-15 00:52:54 · 1129 阅读 · 0 评论 -
POJ 3642 长方体体积并 线段树 扫描线
这题就是给出了好多个长方体, 求出那些被覆盖了 3次及以上的体积我们注意到z的范围很小,而且就给了1000个长方体那么可以把z坐标离散化然后在相邻的z坐标空间内,就变成了求面积覆盖记录三个变量,代表一次覆盖,两次覆盖,三次覆盖及以上#include #include #include #include #include #include #include原创 2012-08-29 14:24:20 · 1306 阅读 · 0 评论 -
HDU 4125 2011福州现场赛E题 KMP+笛卡尔树
题意就不描述了。 主要说一下我的构造第一个串的过程对给出的序列,比如5 1 3 2 7 8 4 6 给每个数按输入的顺序对应一个编号5 1 3 2 7 8 4 61 2 3 4 5 6 7 8然后我们手动建这颗二叉搜索树。观察它,可以发现,每个结点的编号是满足堆的性质。也就是如果把这个编号当做每个结点的第二个关键字,这就是原创 2012-09-12 11:42:44 · 3730 阅读 · 0 评论 -
HDU 4419 矩形面积并
这题貌似想法挺简单的。跟普通的矩形并变形一下把三种颜色分别对应一个二进制位,那么用十进制数表示 R, G, B, RG, RB, GB, RGB就是 1,2,4,3,5,6,7然后在pushup操作中把这些东西更新一下就行了注意,普通矩形并是一条线段表示进入矩形,另一条表示出了矩形,那么本题中就对三种颜色分别记录了当时比赛的时候写的比较蛋疼。完全是码农写法。其实完全可以写的原创 2012-09-24 01:40:31 · 1100 阅读 · 0 评论 -
[Usaco2008 Nov]lites 开关灯 线段树 区间异或及求和操作
Farmer John尝试通过和奶牛们玩益智玩具来保持他的奶牛们思维敏捷. 其中一个大型玩具是 牛栏中的灯. N (2 <= N <= 100,000) 头奶牛中的每一头被连续的编号为1..N, 站在一个 彩色的灯下面.刚到傍晚的时候, 所有的灯都是关闭的. 奶牛们通过N个按钮来控制灯的开关; 按第i个按钮可以 改变第i个灯的状态.奶牛们执行M (1 嚓。好久没写线段树原创 2012-11-29 22:33:15 · 3065 阅读 · 3 评论 -
POJ 3145 HDU 3303 Harmony Forever 线段树 + 鸽巢定理
大意就是对一个集合,有两种操作,一个是将某个元素加入集合中,一个是问当前集合中mod y 最小的数,如果有多个,输出最近加入的那个元素,当然题目要求的是输出他们加入集合的时间是什么。题目的数据范围一看就是线段树类型的。然后对每个y,由鸽巢定理,y+1个数中必然存在mod y相同的数,那么分为多个区间进行查询,即[0, y - 1] [y , 2 * y - 1]…… 然后取最优解即原创 2012-03-22 16:11:21 · 2361 阅读 · 0 评论 -
HDU 1255 覆盖的面积 线段树 扫描线
还是先离散化坐标,然后用线段树扫描线其中sum代表被覆盖过一次的长度,sum2代表被覆盖过2次及以上的长度。然后注意pushup操作比较麻烦。/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #include #原创 2012-03-20 13:05:26 · 768 阅读 · 0 评论 -
HDU 3397 Sequence operation 线段树(区间合并)
比较麻烦的一道题,各种操作线段树中存储的信息有,覆盖标记,异或标记,0和1的从左到右连续长度,从右到左连续长度,区间最大连续长度/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #include #inc原创 2012-03-06 11:47:29 · 970 阅读 · 0 评论 -
POJ 2828 Buy Tickets
本题使用了一个巧妙的构造方法,首先,如果按顺序插队的话,序列是无法确定的,因为插队的时候被插的人的位置会改变。所以可以倒过来想,最后一个人的位置必然可以确定,然后接着是倒数第二的,依次的位置就都出来了。然后线段树的功能是统计区间内可插的位置数吧,我们可以先想想叶子节点,如果这个位置被确定了,那么该叶子节点的值应该变为0了,就相当于有了一个新的队列,是不包含值为0的叶子节点的队列,那么再插的时候原创 2011-10-15 22:28:25 · 734 阅读 · 0 评论 -
线段树水题几枚
最近接触了一下线段树,按理来说这个半年前就该看了,实际上自己却总想刷水题而躲避难题,不过,该来的还是要来的,既然选择了数据结构,就让各种树来的猛烈些吧。以下为最初级的线段树,只更新点,没有delay操作1.HDU 1166 敌兵布阵这道题用线段树或者树状数组都可以做,HDU上的数据貌似很弱,模拟竟然都能过首先是线段树版 ,线段树所带信息为当前区间所有点的值的和原创 2011-10-15 21:57:29 · 2007 阅读 · 0 评论 -
POJ 1436 Horizontally Visible Segments 线段树
题目大意是,给出了很多条平行于y轴的线段,然后定义,两条线段能互相‘看见’的条件是,两条线段能由一条水平线连接,且这条水平线不能跟其他的所有线段有交点。而题目要求的是,3个线段能互相看见,这个条件下有多少组不同的。然后就能明显的感觉到是区间覆盖问题了。但是有一个细节问题,就是中间的水平线不一定经过整点,所以即使这个区间的所有点都被覆盖,也不能说其就不能穿过一条线,于是,可以将所有线段的长度原创 2012-02-28 21:56:51 · 1097 阅读 · 1 评论 -
线段树几题 --------- 成段更新
线段树的成段更新,需要用到延迟标记就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候否则就会退化到O(n)的复杂度1.hdu 1698 Just a Hook大意是每次把某一段所有数的值改变成某个值,最后求总和。#include #include #include #include #include #include原创 2011-10-29 11:32:00 · 958 阅读 · 0 评论 -
POJ 3225 Help with Intervals 线段树
这是道比较经典的线段树 详情可以参考http://www.notonlysuccess.com/index.php/segment-tree-complete/ sha崽大神的bolg但需要注意的就是区间到点的转化了。 要保证转化后的区间满足集合的基本性质,比如删除一些区间后相应的点被删除,有可能会点删除完了,区间却还有,这就不符合了。所以就要把每个点乘以二之类的,还有一些细节,注意原创 2012-02-28 18:06:52 · 746 阅读 · 0 评论 -
POJ 2991 Crane 线段树
这个题比较神奇。大意就是有一个长杆,杆上有一些关节点,可以转动,然后每次操作就是将某个关节点的角度变成某个角度,最后求末尾的坐标。线段树每个结点存的信息是,这一段末尾的x坐标,y坐标,以及该段与y轴的夹角,其中x,y坐标是与上一段线段的相对坐标。这样的好处是显而易见的。注意,这个与y轴的夹角是该段线段顺时针旋转至初始状态的角度,如下图然后每次更新的时候需要注意,是把某个结点后的所有原创 2012-03-01 21:06:22 · 1495 阅读 · 0 评论 -
POJ 3667 Hotel 线段树区间合并
这道题应该算是比较经典的线段树了题意是:这座巨型宾馆在一条超长走廊上有N(1 ≤ N ≤ 50000)个排成一排的房间,每个房间都能欣赏到苏必利尔湖的好景色。现在所有的房间都是空的。现在Bessie等旅客们正在不断地发出订房和退房要求。你需要接受M(1 ≤ M 每条指令的第一个数字为1或2。如果是1,后面将有一个整数D表示顾客要预定的房间数。注意,这些房间必须是连续原创 2012-03-04 00:48:55 · 848 阅读 · 0 评论 -
hdu 3308 LCIS 线段树 区间合并
好题一个,区间合并问题大意就是问某个区间内最长连续上升序列的长度跟POJ 3667 Hotel 差不多,貌似还更简单一些,因为只有单点更新用到了lmx, rmx, mx,表示从左端点往右的连续长度,右端点往左的连续长度,区间内的最大连续长度/*ID: sdj22251PROG: inflateLANG: C++*/#include #include #include原创 2012-03-04 16:15:17 · 979 阅读 · 0 评论 -
POJ 2892 hdu 1540 Tunnel Warfare 线段树 (区间合并)
这个题目的大意就是,求某个点所在的最长连续区间区间合并此类题目的通常做法都是开3个变量,区间最大值,从左往右的连续区间长度,从右往左的连续区间长度。然后更新的时候更新到点就行了。查询的时候,只需要知道,某个点所在的连续区间,一定是由某个线段的左儿子的从右往左的连续区间和右儿子的从左往右的连续区间构成的/*ID: sdj22251PROG: subsetLANG:原创 2012-03-06 00:27:54 · 974 阅读 · 0 评论 -
HDU 2871 Memory Control 线段树(区间合并)+二分查找+vector的常用方法
这道题给人的感觉就是恶心人。刚开始完全不懂怎么找含有x的区间,后来看别人都说用vector,然后用之,发现很好用啊,支持插入和擦除操作,我原来竟然不知道还有这些功能.vector中的insert函数iterator insert( iterator loc, const TYPE &val ); void insert( iterator loc, size_type num, c原创 2012-03-06 18:18:07 · 863 阅读 · 0 评论 -
Codeforces Round #111 (Div. 2) E题 Buses and People 线段树+离散化
这题一看就是离散化加线段树,但是怎么建树确实没想出来。不过看到每个bus的时间点都不同,可能会有一点提示。后来仿照一个神牛的代码写了一下 。思路是这样的:首先,将bus和person的起止坐标一并取出到一个数组中,然后离散化之,对每个人每个bus都记录一下id,然后就是把这些坐标排序,去重,数组大小数就是线段树的长度了, 就可以建树了。然后用二分查找把bus和人的起止坐标在数组中的位置找出原创 2012-03-07 16:54:46 · 1217 阅读 · 2 评论 -
POJ 1177 Picture 矩形周长并
题意很简单,但是周长并比面积并又稍微麻烦了一些这时候要开一个numseg存储竖边的个数。再开lbd,rbd分别表示边界,这样是为了帮助删除重合的边/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #in原创 2012-03-24 21:51:26 · 956 阅读 · 0 评论 -
POJ 3368 Frequent values 线段树
文字解释见 http://hi.baidu.com/lewutian/blog/item/d0e058ea85b780d8d539c9bf.html/*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #include原创 2012-03-28 19:59:06 · 733 阅读 · 0 评论 -
HDU 3564 Another LIS 线段树+最长上升子序列
排队问题是线段树中很常见的题型。题目大意就是不断的向一个序列插入数据,插入的位置为当前序列的第某个位置,每次插入后都要求当前序列的最长上升子序列的长度。 /*ID: sdj22251PROG: subsetLANG: C++*/#include #include #include #include #include #include #include #原创 2012-03-14 22:03:34 · 1265 阅读 · 0 评论 -
[Usaco2010 Mar]balloc 农场分配
Farmer John最近新建立了一个农场,并且正在接受奶牛的畜栏分配请求,有些畜栏会看到农场美妙的风景。:)农场由N (1 (1 这样的话奶牛可以在这段牛棚里面转悠。(当然,这段畜栏必须要有足够的空间)给出M (1 具体做法就是对请求,按照r关键字递增排序,然后r相同就按照l递减排序。总的来讲就是优先截止早的区间,相同的话就优先区间长度原创 2013-10-24 21:53:43 · 2005 阅读 · 0 评论