
线段树专章
playwfun
宁静致远
展开
-
线段树重开 poj 2528(离散化)
离散化手法:本人现把 “实段”区间,现转换为 “端点区间” 意思 1-2的“实段” 区间对应在坐标轴上从点1到点3的一个端点区间。然后把所有坐标加入数组排序去重,一个线段区间,总可以被分割为若干段。如 1 - 5 2 - 3 两段,那么 数组内 1 2 4 6 那么原来的 1 - 5 段 被拆分为端点段 1 - 2 , 2 - 4,,4-6三段对应线段树上的三个连续点(本人线段树原创 2015-04-10 20:55:25 · 348 阅读 · 0 评论 -
HDU 5831(思路题目)
本题目的意思是给定一个长为n的数组: 给定很多查询区间 li,ri; 首先来观察一下,对于两个区间直接存储待查询的信息,那么是否可以通过维护一些值直接推导出合并区间的待查询值 ? 答案是可以,因为合并时只需左右子区间维护关于包含左右端点往左右延伸的gcd数目,gcd数组,和个数数组,即可合并。有了合并,就迎刃而解。 通过这题,想用线段树时,多关注一下有没有上推的性原创 2015-08-17 22:21:59 · 407 阅读 · 0 评论 -
HDU - 5239(又遇区间升级)
首先,来说明本题目的特殊性,其实打表找规律,最多迭代次数不超过50就可以使得每个点结果不再改变。那么就变成了经典的区间升级问题,同 HDU3954这里,要特别说明一下,思想就是,在加新的一次标记的时候旧的标记能升级的已经被升级完毕,所以标记可以叠加更新。注意:标记下推的定义,当前位置的标记已经更新当前线段,但并未下推标记。原创 2015-05-30 21:36:15 · 765 阅读 · 0 评论 -
HDU 3954(线段树)
本题目有一个难点,即每个点的升级问题,会导致直接用惰性标记无法达成下推(因为两次标记,在第一次就可能升级,值就和叠加的标记值不同)那么考虑到这个问题中k值很小,如果假定当前线段树中所有的标记都不会引起升级(初始时,没有标记,成立),那么把这次的标记先加入线段树中,这时新的标记可与原来的叠加,但不一定可以和后面的叠加,那么为了解决这一个问题,只需要该升级的点都升级,那么就不会和下一次的标记产生矛原创 2015-05-07 15:27:50 · 424 阅读 · 0 评论 -
hdu 5217(线段树)
首先建立一颗线段树,每个节点存储两个值R, L, 代表如果仅仅使用这个区间的括号,那么匹配结束之后剩下R个右括号和L个左括号,修改操作很容易实现对于询问操作,我们首先可以在线段树上询问出消除掉匹配的括号之后,每种括号分别剩下多少个(显然,最后必定是'))..)(..(('这种形式),那么我们就知道了第K个括号是哪种类型的(或者不足K个括号,输出-1)容易发现,如果我们从左向右访问线段树,那么'转载 2015-05-08 19:55:53 · 500 阅读 · 0 评论 -
HDU - 3397(综合)
有五种操作。其中前三种为改,区间改1,改0,和区间0,1反转 下推标记分当前要下推的标记是否要改,两种情况。查询为两种差区间1的和, 区间最大连续为1的区间。#include #include #include #include using namespace std;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1#def原创 2015-04-17 15:30:45 · 420 阅读 · 0 评论 -
zstu 3125(线段树)
区间修改,加单点查询和修改。区间增加某值,又要修改一点,加惰性标记好像是唯一办法了。修改区间最大值最靠左的一点,先找到logn个划分区间最左边内个包含最大值的区间,然后对该区间就比较好查了。下面代码,并未提交,zstu 系统崩溃ing#include #include #include #include #include using namespace std;#de原创 2015-04-17 11:04:15 · 350 阅读 · 0 评论 -
HDU - 3308(区间合并类)
只需单点修改和求区间最大连续上升序列长度。那么,维护左的最大升长,右的最大降长,和区间最大升长。便可区间合并。因为查询的区间合并和上推区间合并动作一致,用一个node函数抽象一下就行了。#include #include #include #include #include using namespace std;typedef long long LL;#define ls原创 2015-04-16 21:54:50 · 360 阅读 · 0 评论 -
UVA - 1400(区间连续最大和)
用三个值来维护最大值,pre_max,suf_max,max;分别代表区间的前缀最大和,后缀最大和,和连续最大和。则 每个线段都维护三个值,边可以合并。注意为了求出所要求的区间最优区间l,r还要 维护当前最优l,r和前缀最大和最优位置prep,后缀最大和最优位置sufp,且维护时尽量选靠左的点;这里的向上push_up和要查区间的合并,其实都是对两个线段的合并,先一个函数就可以了。原创 2015-04-15 20:52:55 · 531 阅读 · 0 评论 -
线段树重开poj - 3667
本题目重做感受颇多,思考的深度决定了对线段树的掌握程度,只有自己创生的才是自己的啊。本题用到了三个维护值,sum表示区间最长连续区间,lsum为区间左面最长连续区间长。rsum同理。现在来说明sum为什么具有 可维护性,线段树的可维护性是相对于更新区间而言的,因为更新的logn个区间总是被刷成全空房间,或全满房间,所以这几个区间的三个属性都可以得到维护,并且具有向上的合并性质所原创 2015-04-08 22:05:25 · 304 阅读 · 0 评论 -
2014上海邀请赛 B (扫描线 + 线段树)
这题算是经典的扫描线算法题目了,稍加分析,对任意一点(x,y) 要使长W宽H的右上角为(a,b)的的矩形包含该点,那么(a,b)必须在矩形A(左下角(x,y),右上角(x+W,y+H))范围内。由此把每个点抽象为一个矩形,让这些矩形相交,求一点使得被覆盖的次数最大。那么把每个矩形转换为左右两条边,加入扫描队列,有线段树维护区间最大值即可。还有点,即点的实段化,在线段树中,将矩形的每原创 2015-04-13 21:18:27 · 475 阅读 · 0 评论 -
线段树重开 HDU 1542(扫描线)
#include #include #include #include #include #include #include #include #include #include using namespace std;typedef long long LL;#define lson l,m,rt<<1#define rson m+1,r,rt<<1|1const i原创 2015-04-11 16:31:22 · 317 阅读 · 0 评论 -
线段树重开poj 3225
这里涉及多标记下推问题。有区间 改1 改 0 和 反转10 三种操作那末可以用一个col 标记数组来维护,0(或1)代表区间改0(或1),2代表区间反转,由于标记2比较特殊下推时候,要特别注意,见upd_one_seg函数。还有线段树中下推标记的关键动作。下推标记或对分解的logn个区间加标记时原区间都可能有标记。标记推到最底层不需在下推,(因为标记的意思为当前区间已经被更原创 2015-04-11 08:39:49 · 340 阅读 · 0 评论 -
HDU 4913 (思路题目)
题目意思是给定序列长度同为n的数列a,b; 要求出所有的子集元素的 2 ^ (max(a) ) * 3 ^ (max(b))的和。分析:首先对只有一个数组a,我们的通常思路是先排序 , 递推算法求解。 ans[ i ] = ans[ i-1 ] + 2^(i-1) * 2^a[ i ];那么多了一个b数组,可以先按b排序 。记走到 i , 前面 a的值比ai小的有x个,原创 2015-09-25 14:22:29 · 740 阅读 · 0 评论