线段树总结

出处:http://blog.csdn.net/shiqi_614/article/details/8228102#comments

之前做了些线段树相关的题目,开学一段时间后,想着把它整理下,完成了大牛NotOnlySuccess的博文“完全版线段树”里的大部分题目,其博文地址Here,然后也加入了自己做过的一些题目。整理时,更新了之前的代码风格,不过旧的代码仍然保留着。

      同样分成四类,不好归到前四类的都分到了其他。树状数组能做,线段树都能做(如果是内存限制例外),所以也有些树状数组的题目,会标示出来,并且放到其他类里。

一、单点更新

       1.hdu1166 敌兵布阵:有N个兵营,每个兵营都给出了人数ai(下标从1开始),有四种命令,(1)”Addij",表示第i个营地增加j人。(2)“Sub i j”,表示第i个营地减少j人。(3)“Query ij",查询第i个营地到第j个营地的总人数。(4)”End“,表示命令结束。解题报告Here。

       2.hdu1754 I Hate It:给你N个数,M个操作,操作分两类。(1)"QAB“,查询区间[A,B]内的最大值。(2)"UAB",将第A个数的值改成B。解题报告Here。

       3.hdu1394Minimum Inversion Number:给你N个数,要求统计它的所有形式的逆序对的最小值。它的所有形式的意思是,不断将数组开头的第一个数放到数组的最后面。解题报告Here。

       4.hdu2795 Billboard:有一块板,规格为h*w,然后有n张海报,每张海报的规格为1*wi,选择贴海报的位置是:尽量高,同一高度,选择尽量靠左的地方。要求输出每张海报的高度位置。解题报告Here

       5.poj2828 BuyTickets:有N个人排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos。要求把队伍最后的状态输出。解题报告Here

       6.poj2886 Who Getsthe Most Candies?: N个小孩围成一圈,他们被顺时针编号为 1 到 N。每个小孩手中有一个卡片,上面有一个非 0 的数字,游戏从第 K 个小孩开始,他告诉其他小孩他卡片上的数字并离开这个圈,他卡片上的数字 A 表明了下一个离开的小孩,如果 A 是大于 0 的,则下个离开的是左手边第 A 个,如果是小于 0 的,则是右手边的第 A 个小孩。游戏将直到所有小孩都离开,在游戏中,第 p 个离开的小孩将得到 F(p) 个糖果,F(p) 是 p 的约数的个数,问谁将得到最多的糖果。输出最幸运的小孩的名字和他可以得到的糖果。解题报告Here

       7.hdu4288 Coder & CF85-DSum of Medians:有三种类型的操作,(1)."add x",表示往集合里添加数x。(2).“del x”表示将集合中数x删除。(3).“sum”求出从小到大排列的集合中下标模5为3的数的和。集合中的数都是唯一的。解题报告Here

       8.CodeforcesBeta Round #19 D. Points:有三种操作“add x y”往平面上添加(x,y)这个点,"remove x y",将平面上已经存在的点(x,y)删除,“find x y”找出平面上坐标严格大于(x,y)的点,如果有多个点找x最小的,再找y最小的。解题报告Here

       9.poj2481 Cows:有N头牛,每只牛有一个测试值[S,E],如果对于牛i和牛j来说,它们的测验值满足下面的条件则证明牛i比牛j强壮:Si <=Sjand Ej <= Ei and Ei - Si > Ej - Sj。现在已知每一头牛的测验值,要求输出每头牛有几头牛比其强壮。解题报告Here

       10.hdu3950 Parking Log:有T组测试数据,每组数据的N和Q分别表示停车场有N个位置(下标从1开始),Q个操作。操作有两种(1)"A M L R",表示这个车队有M辆车,如果前面的空位,要求与前面的车的距离不超过L,如果后面有车,要求与后面的车的距离不超过R,如果前面或后面没有车,条件L,R的限制忽略,如果有满足条件的位置输出起点的下标,如果有多个满足条件的位置输出下标最小的一个,如果没有满足条件的位置,输出-1。(2)"BK",表示从左到右数第k个车队离开。解题报告Here

       11.hdu4521 小明系列问题——小明序列: 有多组测试数据,每组数据的n和d表示,有n个数,求间距大于d的最长上升序列。解题报告Here

       12. CodeforcesBeta Round #99 (Div. 1) C Mushroom Gnomes - 2:有n棵树,m个蘑菇,每棵树有坐标a,高度h,向左边倒的概率,向右的概率(概率用0-100表示),向左倒范围[x-h,x)内的蘑菇被破坏,向右倒范围(x,x+h]范围内的蘑菇被破坏。每个蘑菇有坐标b,及它的魔力值z。解题报告Here

二、成段更新

        简单的说明:成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候。延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当前区间已经更新了。

       1.hdu1698 Just a Hook:给你T组数据,N个数(初始时每个数的值为1),M个操作,每个操作把区间[a,b]里的数更新为c,问最后这N个数的和是多少。解题报告Here

       2.poj3468 A SimpleProblem with Integers:给你N个数,然后有M个操作。有两种类型的操作,(1)“Ca b c”,表示将区间[a,b]里的数加上c。(2)“Q a b”,表示查询区间[a,b]的数的和。解题报告Here

       3.poj2528 Mayor’sposters:有t组测试数据,有n张海报,海报按题目给出的顺序覆盖,问最后能看到几张海报。解题报告Here

       4.poj1436Horizontally Visible Segments:(题意没懂。。)

       5.poj2991 Crane:有N根杆子,前后两根杆子通过一个节点连接,每个节点可以旋转一定的角度,每次给你一个操作(s,a)表示将第s与s+1之间的角度修改为a度,并且每次操作之后都需要求出第N个节点的位置。解题报告Here

       6.uestc1425 Another LCIS:有T(t<10)组数据,给你N个数,M个操作(n和m都小于100000)。操作有两种类型,(1)“q a b”,查询区间[a,b]里的最长连续上升序列的长度。(2)“a l r v”,将区间[l,r]里的数全部增加v。解题报告Here

       7.uestc1546 Bracket Sequence:给你有N个字符的由'('或‘)'组成的括号序列,有三种操作(1)"set l r c",表示将区间[l,r]里的所有元素改变为c,c是'('或')'的其中一种。(2)"reverse l r",表示将区间[l,r]里的'('与')'对调。(3)"query l r",表示查询区间[l,r]是否为一个合法的括号序列。解题报告Here

       8.CodeforcesRound #136 (Div. 2) D. Little Elephant andArray:给你N个数M个查询,问在每一个查询区间[l,r]范围内有多少个值为valu的数出现次数也为valu。解题报告Here。(这道题,成段更新查询点和单点更新查询区间都可以)

       9.Uva 12436 RipVan Winkle's Code:对于长度为250000的区间,给了你四种操作:操作A,从st到ed这段区间内的数,分别加上1,2,...,st-ed+1。操作B,从st到ed这段区间内的数,分别加上,st-ed+1,st-ed,...,1。操作C,将st到ed这段区间内的数赋值成x。操作S,查询st到ed的这段区间内的数的总和。解题报告Here

       10. CodeforcesRound #169 (Div. 2) E.Little Girl and Problemon Trees:一棵树有n个节点,但是除了根节点1外,其他节点都的出度和入度加起来就只有2(就是棵树是由几条链的第一个节点粘在一起的),现在有两种操作(1)"0 v x d",在距离v节点距离d以内的所有节点的权值都加上1,(2)"1 v",查询节点v上的权值。解题报告Here

       11.CodeforcesBeta Round #35 (Div. 2) E. Parade:给你n个建筑的楼顶的高度,以及楼顶的左坐标l,右坐标r(可以看成是线段),问整个建筑的轮廓的转折点。解题报告Here

       12.Zoj3299 Fall the Brick:有n排板砖,m个木板,边界的l和r的n列板砖从天上掉下来,然后有m个边界的a,b的高度为h的木板去接那些板砖,一排板砖中的部分板砖如果掉到木板上就停止下落,剩下的继续下落,问最后每块木板上有多少块板砖。解题报告Here

       13.fzu2105 Digits Count:给你N个数,有四种操作。(1)"ANDopnL R",表示对区间[L,R]内的数全部与opn进行且(&)操作。(2)"OR opn L R",表示对区间[L,R]内的数全部与opn进行或(|)操作。(3)"XOR opn L R",表示对区间[L,R]内的数全部与opn进行异或(^)操作。(4)"SUMopnL R",求出区间[L,R]的数的和。解题报告Here

       14.hdu 4533 威威猫系列故事——晒被子:给你N个矩形,每个矩形给出左下角坐标,右上角坐标,有M个询问,每个询问给出一个时间t,问(0,0),(t,t)的范围内矩形的面积和(重叠的也算)。解题报告Here

三、区间合并

区间合并是在线段树查询的时候,对当前区间的左右儿子进行合并。

       1.poj3667 Hotel:有N个房间,M次操作。有两种操作(1)"1a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住。(2)"2 b len",把起点为b长度的len的房间清空,即退房。解题报告Here

       2.hdu3308 LCIS:给你N个整数,有两种操作,(1)"U A B",表示把第A个数变成B,"QAB",表示查询区间[A,B]的最长连续上升序列。解题报告Here

       3.hdu3397 Sequence operation:有N个为0或为1的数,有M个操作,操作有5种类型。(1)“0 a b”,表示将区间[a,b]范围内的数全部置0。(2)“1 a b”,表示将区间[a,b]内的数全部置1。(3)"2 a b",表示将区间[a,b]内的数0变成1,1变成0。(4)"3ab",表示查询[a,b]范围内1的数。(5)"4 a b",表示查询[a,b]范围内最长的连续的1。解题报告Here

       4.hdu2871 Memory Control:给N个单位内存(编号从1开始),有4种操作,(1)"Reset",表示把所有的内存清空,然后输出"Reset Now"。(2)"New x",表示申请一块长度为x的内存块(如多解,左边优先),然后输出"New at A",A表示该内存块的起点。(3)"Free x",表示把包含第x块单位内存的内存块清除,然后输出"Free from A toB",A和B分别表示该内存块的起点和终点(4)"Get x",表示返回第x块内存块的起始内存单位编号,然后输出 "Get at A"。解题报告Here

       5.hdu1540 Tunnel Warfare:有N个村子排成一条直线,每个村子都连接了它的左右两个村子(除了最左边和最右边的外),有3种操作,(1)"D x",表示将第x个村子摧毁。(2)"Qx",表示查询与第x个村子直接和间接相连的村子有多少个。(3)"R",表示将最早摧毁的村子复原。解题报告Here

       6.CodeforcesBeta Round #43 D. Parking Lot:有一条长度为L的街道,有N个操作,操作有两种,(1)"1 a",表示有一辆长度为a的车开进来想找停车位,停车位必须满足与它前面的车距离至少为b,与后面的车距离至少为f.如果能找到这样的停车位,输出这辆车的起始位置(且这个位置最小),否则输出-1。(2)"2 a",表示第a个事件里进来停车的那辆车开出去了。解题报告Here

四、扫描线

       1.hdu1542 Atlantis:给你N个矩形,每个矩形给出左下角的坐标,右上角的坐标。最后以N=0为结束。要你求出矩形并后的面积。解题报告Here

       2.hdu1828 Picture &poj 1177 Picture:给你N个矩形,每个矩形给出左下角的坐标,右上角的坐标,要求矩形并后的周长。解题报告Here

       3.hdu1255 覆盖的面积:有T组测试数据,每组数据先给一个数字N,接下来的N行里,每行四个浮点数表示矩形的左上角坐标和右下角坐标,要求这些矩形至少覆盖过两次的面积。解题报告Here

       4.hdu 3642Get The Treasury:有T给测试数据,每组数据先给一个数字N,接下来的N行里,每行里有6个数字,分别是x1,y1,z1,x2,y2,z2,表示这个长方体x轴方向的范围从x1到x2,y坐标和z坐标类似,求至少有三个长方体相交的体积是多少。解题报告Here

       5.poj2482 Stars inYour Window:给你10000以内的星星的坐标和星星的亮度(即分别为x,y,c),要求用W*H的矩形去围住一个区域,使得这个区域内的星星的亮度最大,并且要求矩形边框上的星星不计入内。矩形可以平移,但不能旋转。解题报告Here。(PS:这题的题面好美~)

       6.poj2464 BrowniePoints II:在平面直角坐标系中给你N个点,stan和ollie玩一个游戏,首先stan在竖直方向上画一条直线,该直线必须要过其中的某个点,然后ollie在水平方向上画一条直线,该直线的要求是要经过一个stan之前画过的点。这时候平面就被分割成了四块,两个人这时候会有一个得分,stan的得分是平面上第1、3象限内的点的个数,ollie的得分是平面上第2、4象限内的点的个数,在统计的时候在所画线上的点都不计算在内。求最终stan使得自己的最差得分最高,并且输出此时ollie的得分。解题报告Here

       7.hdu3255 Farming :有N块农田,每块农田中种一种作物,每种作物都有一个价格,当在同一区域内种植了两种不同的作物时,作物价格大的生存下来,作物价格小的死亡。求最后的所有作物的能买的总钱数。解题报告Here

       8.uva 11983 WeirdAdvertisement:给出N个矩形,求被这些矩形覆盖K次以上的区域面积。解题报告Here

       9.hdu4052 Adding New Machine:给你W*H大小的矩形,其中有N个地区不能使用(给出了这个地区的两个顶点的坐标即(x1,y1)和(x2,y2)),问能下多少个1*M的矩形。解题报告Here

       10.uestc1525 Fruit Ninja:有T组测试数据,每组数据的N,H,W表示有N个炸弹或水果,H和W表示用来“切”水果的板砖的长宽,要求W必须平行于X轴,H必须平行于Y轴。问一板砖下去,最多能拍到多少个水果(要求不能拍到炸弹),在拍到最多水果的前提下,问板砖有多少种拍水果的方案(即如果板砖的四条边上都要水果“牺牲”,那么方案数计一,否则板砖就可移动,那么方案数就是so many!)。解题报告Here

五、其他

       1.hdu3954 Level up:有N个英雄,每个英雄的初始等级为1,初始经验为0,有K个等级,QW个操作。接下来一行中有K-1个数值,代表升到等级2,等级3……所要达到的经验。接下来的QW行里,每行是一个操作,操作有两类,(1)"l r e",代表区间[l,r]里的每个英雄将得到e乘以他的等级的经验。(2)"lr",表示查询区间[l,r]里经验最大值。解题报告Here

       2.hdu4027 Can you answer these queries?:给你N个数,有M个操作,操作有两类,(1)"0 l r",表示将区间[l,r]里的每个数都开根号。(2)"1 l r",表示查询区间[l,r]里所有数的和。解题报告Here

       3.hdu3333Turing Tree & hdu3874Necklace:有T组数据,每给数据有N个数,有Q个查询,每个查询要求区间[l,r]之间数的和,但是出现多次的某个值只能算出现一次。解题报告Here

       4.hdu3016 Man Down:有N块木板,每块木板有四个属性,高h(h>0),左边界xl,右边界xr,以及掉落在它上面,获得多少生命值value(可能为负),一个人从最高的木板开始往下跳,初始时生命值为100,问最后掉落到地面能获得的生命值最多为多少(如果生命值为0,那么这个人会死去),如果无法跳到地面,输出-1。解题报告Here

       5.hdu3340 Rain in ACStar:天上掉下一些图形(三边、四边、五边形)在数轴上,求数轴上某一段区间落下的图形的面积和。解题报告Here

       6.ZOJ3511 Cake Robbery:有一个N凸边形,顺时针编号1到N,沿对角线切了M刀,保证任意两刀之间不相交(除了端点),问在切这M刀的过程中,得到的凸多边形的最大的边数是多少。解题报告Here

       7.UESTC1558 Charitable Exchange:star开始有1元的东西,有N种交易,每种交易Vi,Ri,Ti表示用至少Ri的东西去换得Vi的东西,这个过程要求的时候是Ti。问最后得到至少M元的东西,如果能得到花费的最少的时间是多少。解题报告Here

       8.spojGSS21557 Canyou answer these queries II:题意:给你N个数,每个数a[i]的范围在[-100000,100000],然后有Q个查询,每个查询问区间[x,y]内最大子区间和为多少,并且重复出现的值只能计算一次(如果是负数,输出0,即可以子区间可以为空)。解题报告Here

       9.poj3162 WalkingRace:给你一棵有N个节点的树,树边为权值,要你求出树上每个点到其他点的距离中最大的那个值。对求出的从节点1到节点n最大值,找出最长的一段使得这一段中最大值减最小值的结点小于等于M。解题报告Here

       10.hdu4358 Boring counting:给你一棵树,树上的每个节点都有树值,给M个查询,问以每个点u为根的子树下有多少种权值恰好出现k次。解题报告Here

       11.hdu4267 A Simple Problem with Integers:给你两个操作,,(1)“1 a b k c”,表示在区间[a,b]内位置满足(i-a)%k=0的数加上c,k的范围在1到10之间。(2)“2 a”,表示查询第a个数。解题报告Here。(解题报告里用树状数组做的)

       12.hdu4417 Super Mario:给你N个数,M个查询,对于一个查询问在[a,b]范围内小于c的数有多少个。解题报告Here。(解题报告里用树状数组做的)

       13.UVALive4730 Kingdom:在二维坐标平面上,有N个城市,M个操作,操作有两类,(1)(1)"road A B",表示将城市A和城市B通过一条道路连接,如果A和B原来属于不同的城市群,经过这个操作,A和B就在一个城市群里了,保证每条道路不会和其他道路相交(除了端点A和B)。(2)"lineC",表示查询当穿过y=C的直线,有多少个城市群、这几个城市群一共有多少个城市。解题报告Here

       14.CodeforcesRound #163 (Div. 2) E. More Queries toArray...:题意:有N个数,M个操作。(1)"= l rk",表示把区间[l,r]的数全部变成k。(2)"? l rk",查询区间[l,r]范围里,式子ai*(i-l+1)^k的和。解题报告Here

六、结语

        到这里,终于把待续两个字去掉了,当然,并不是以后不更新,只是现在不会再去专门找线段树的题目做(虽然我知道还有很多,呵呵。。),只是遇到了才会把它放进来。当时开始整理的时候,想说,如果整理完,也像NotOnlySuccess大神那样到处打广告,然后从学期初到一直到现在期末了,终于是按计划整理完,结果也没感觉太高兴,或许是因为感觉自己还很拙,也就不去打广告了,屌丝,还是多做些题去,呵呵。明天要考试,下午阳光刚好照进宿舍,晒会太阳,上自习去好了。

        整理了这么久,感谢UESTC_Fish学长及其他人的帮忙。by UESTC_shiqi614 

你可能感兴趣的:(c,ACM,X)