线段树总结

线段树是一个重要的东东,还是要好好整理的。刷了题便整理了一下(留坑待填)

有些题可以多维护一些值起到剪枝的效果


一、单点更新

       1.hdu1166 敌兵布阵

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


       2.hdu1754 I Hate It

给你N个数,M个操作,操作分两类。

(1)"QAB“,查询区间[A,B]内的最大值。

(2)"UAB",将第A个数的值改成B。题解


       3.hdu1394Minimum Inversion Number

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


       4.hdu2795 Billboard

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


       5.poj2828 BuyTickets

有N个人排队,每一个人都有一个val来对应,每一个后来人都会插入当前队伍的某一个位置pos。要求把队伍最后的状态输出。


       6.poj2886 Who Getsthe Most Candies?: 

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


       7.hdu4288 Coder & CF85-DSum of Medians

有三种类型的操作,(1)."add x",表示往集合里添加数x。(2).“del x”表示将集合中数x删除。(3).“sum”求出从小到大排列的集合中下标模5为3的数的和。集合中的数都是唯一的。


       8.CodeforcesBeta Round #19 D. Points

有三种操作“add x y”往平面上添加(x,y)这个点,"remove x y",将平面上已经存在的点(x,y)删除,“find x y”找出平面上坐标严格大于(x,y)的点,如果有多个点找x最小的,再找y最小的。


       9.poj2481 Cows

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


       10.hdu3950 Parking Log

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


       11.hdu4521 小明系列问题——小明序列: 

有多组测试数据,每组数据的n和d表示,有n个数,求间距大于d的最长上升序列。


       12. CodeforcesBeta Round #99 (Div. 1) C Mushroom Gnomes - 2

有n棵树,m个蘑菇,每棵树有坐标a,高度h,向左边倒的概率,向右的概率(概率用0-100表示),向左倒范围[x-h,x)内的蘑菇被破坏,向右倒范围(x,x+h]范围内的蘑菇被破坏。每个蘑菇有坐标b,及它的魔力值z。


       13.hdu 4605 Magic Ball Game

一个权值为X球从根节点开始下落,每落到一个节点的时候,1.如果X=W[i],或者没有儿子节点了,球停止下落。2.如果X<W[i],球各有1/2的概率落到左右儿子节点。3.如果X>W[i],球有1/8的概率落到左儿子,有7/8的概率落到右儿子。问球落到点v的概率是多少(概率用7^x/2^y表示,即输出x和y就可以)。


       14.URAL 1989 Subpalindromes

给你长度为N的字符串,有M个操作,操作有两种类型(1)“change i a”,表示将第i个字符变成a,(2)“palindrome? j k”,询问[j,k]的字符串是否构成回文串。


       15.hdu 4777 Rabbit Kingdom

给N个数,有M个查询,问区间[L,R]之间有多少个数与这个区间内的其他数都互质。


二、成段更新

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

       1.hdu1698 

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


       2.poj3468

给你N个数,然后有M个操作。有两种类型的操作,

(1)“Ca b c”,表示将区间[a,b]里的数加上c。

(2)“Q a b”,表示查询区间[a,b]的数的和。    题解


       3.poj2528

有t组测试数据,有n张海报,海报按题目给出的顺序覆盖,问最后能看到几张海报。


       4.poj1436:(题意没懂。。)


       5.poj2991

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


       6.uestc1425

有T(t<10)组数据,给你N个数,M个操作(n和m都小于100000)。操作有两种类型,

(1)“q a b”,查询区间[a,b]里的最长连续上升序列的长度。

(2)“a l r v”,将区间[l,r]里的数全部增加v。


       7.uestc1546

给你有N个字符的由'('或‘)'组成的括号序列,有三种操作

(1)"set l r c",表示将区间[l,r]里的所有元素改变为c,c是'('或')'的其中一种。

2)"reverse l r",表示将区间[l,r]里的'('与')'对调。

(3)"query l r",表示查询区间[l,r]是否为一个合法的括号序列。


       8.CodeforcesRound #136 (Div. 2) D

给你N个数M个查询,问在每一个查询区间[l,r]范围内有多少个值为valu的数出现次数也为valu。(这道题,成段更新查询点和单点更新查询区间都可以)


       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的这段区间内的数的总和。


       10. CodeforcesRound #169 (Div. 2) E

一棵树有n个节点,但是除了根节点1外,其他节点都的出度和入度加起来就只有2(就是棵树是由几条链的第一个节点粘在一起的),现在有两种操作

(1)"0 v x d",在距离v节点距离d以内的所有节点的权值都加上1,

(2)"1 v",查询节点v上的权值。


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


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


       13.fzu2105:给你N个数,有四种操作。

(1)"AND x L R",表示对区间[L,R]内的数全部与x进行且(&)操作。

(2)"OR x L R",表示对区间[L,R]内的数全部与x进行或(|)操作。

(3)"XOR x L R",表示对区间[L,R]内的数全部与x进行异或(^)操作。

(4)"SUM L R",求出区间[L,R]的数的和。  题解


       14.hdu 4533

给你N个矩形,每个矩形给出左下角坐标,右上角坐标,有M个询问,每个询问给出一个时间t,问(0,0),(t,t)的范围内矩形的面积和(重叠的也算)。  题解


       15.URAL 1855

有N个城市,M个操作。城市形成一条链,下标分别从1到N,相邻城市有一条道路相连,初始通过每条道路的费用为0。有两种类型的操作,

(1)"change a b d",表示从城市a到城市b之间的每条道路的费用改变d(如果d大于0,增加,反之减少)。(2)"establish a b",表示查询在城市a到城市b之间任意选两个城市作为道路的起点和终点,问通过这些道路的平均费用。


       16.hdu 4578

给你一个数组,初始值为零,有四种操作:

(1)"1 x y c",代表 把区间 [x,y] 上的值全部加c。

(2)"2 x y c",代表 把区间 [x,y] 上的值全部乘以c。

(3)"3 x y c" 代表 把区间 [x,y]上的值全部赋值为c。

(4)"4 x y p" 代表 求区间 [x,y] 上值的p次方和1<=p<=3。    题解


       17.hdu 4455

给定一个整数串,有Q组询问,问这个串中长度为W的子串中不同的数字之和为多少。


       18.hdu 4614

给定一个区间[0,N-1],初始时每个位置上的数字都是0,有两种操作,

1.在位置A开始寻找F(如果没有这么多,则有多少个就找多少个)个数值为0的位置,把位置上的数修改为1,并返回第一个和最后一个修改的位置。

2.查询区间[A,B]内1的个数,并把区间[A,B]每个位置上的数修改为0。


       19.hdu 4747

给你N个数,枚举所有的L和R,问由区间[L,R]之间的数构成的集合里,哪一个数字没有出现,如果有多个,找出最早的一个,设其为x,求所以x的和。


       20.zoj 3724

N个点,对于每个点i,都有一条连向i+1的有向边,另外有M条其他的有向边,有Q个询问(U,V)求U到V的最短路。


       21.cf343D

一棵树有N个节点,有三种操作

1)“1 v",表示将以点v为根节点的子树全部赋值为1,

(2)"2 v",表示将点v以及点v的所有祖先节点全部赋值为0,

(3)"3 v",表示查询点v的值。


       22.URAL 1977

有N(N<10^9)个点,P(P<10^5)个操作,每一秒过后,所以的数都会加上一个值T,每个操作前都有操作的时间,初始的时间是0,操作有两种类型,

(1)"save l r",表示求区间[L,R]之间的所以数的和,并加到tot里,然后把[L,R]清空为零,

(2)"enforce i d",表示点i-d+1和点i+d-1加上值X,点i-d+2和点i+d-2加上值2*X……并且,最后所有数加上的X的和等于tot,这个操作之后,tot清零。


三、区间合并

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

       1.poj3667 Hotel

有N个房间,M次操作。有两种操作

(1)"1 a",表示找到连续的长度为a的空房间,如果有多解,优先左边的,即表示入住。

(2)"2 b len",把起点为b长度的len的房间清空,即退房。    题解


       2.hdu3308 LCIS

给你N个整数,有两种操作,

(1)"U A B",表示把第A个数变成B。

(2)"Q A B",表示查询区间[A,B]的最长连续上升序列。    题解


       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。


       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"。


       5.hdu1540 Tunnel Warfare

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


       6.CodeforcesBeta Round #43 D. Parking Lot

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


四、扫描线

      1.hdu1542 Atlantis

给你N个矩形,每个矩形给出左下角的坐标,右上角的坐标。最后以N=0为结束。要你求出矩形并后的面积。


       2.hdu1828 Picture &poj 1177 Picture

给你N个矩形,每个矩形给出左下角的坐标,右上角的坐标,要求矩形并后的周长。


       3.hdu1255 覆盖的面积

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


       4.hdu 3642Get The Treasury

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


       5.poj2482 Stars inYour Window

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


       6.poj2464 BrowniePoints II

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


       7.hdu3255 Farming 

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


       8.uva 11983 WeirdAdvertisement

给出N个矩形,求被这些矩形覆盖K次以上的区域面积。


       9.hdu4052 Adding New Machine

给你W*H大小的矩形,其中有N个地区不能使用(给出了这个地区的两个顶点的坐标即(x1,y1)和(x2,y2)),问能下多少个1*M的矩形。


       10.uestc1525 Fruit Ninja

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


       11.hdu4419 Colourful Rectangle:给你10000个三种颜色的矩形,不同颜色的矩形相互覆盖会形成不同的颜色,问形成的七种颜色的面积是多少。


       12.zoj 3521 Fairy Wars:平面上有N个子弹,每个子弹的坐标已知,现在在距离点x0,y0为R的圆内,所以的子弹都会变成冰块L*L,并且在L*L范围内的所有其他子弹也会变成冰块,问,当连锁反应结束时,变成冰块的子弹数有多少。


       13.zoj 3525 Disappearance

有三维的空间里有N个点(N<5000),要求用一个长方体LB*LW*LH去包围一些点,使得长方体内的点的权值和最小。


五、其他

      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]里经验最大值。


       2.hdu4027 Can you answer these queries?

给你N个数,有M个操作,操作有两类,(1)"0 l r",表示将区间[l,r]里的每个数都开根号。(2)"1 l r",表示查询区间[l,r]里所有数的和。


       3.hdu3333Turing Tree & hdu3874Necklace

有T组数据,每给数据有N个数,有Q个查询,每个查询要求区间[l,r]之间数的和,但是出现多次的某个值只能算出现一次。


       4.hdu3016 Man Down

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


       5.hdu3340 Rain in ACStar

天上掉下一些图形(三边、四边、五边形)在数轴上,求数轴上某一段区间落下的图形的面积和。

       6.ZOJ3511 Cake Robbery

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


       7.UESTC1558 Charitable Exchange

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


       8.spojGSS21557 Canyou answer these queries II

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


       9.poj3162 WalkingRace

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


       10.hdu4358 Boring counting

给你一棵树,树上的每个节点都有树值,给M个查询,问以每个点u为根的子树下有多少种权值恰好出现k次。


       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个数。(解题报告里用树状数组做的)


       12.hdu4417 Super Mario

给你N个数,M个查询,对于一个查询问在[a,b]范围内小于c的数有多少个。


       13.UVALive4730 Kingdom

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


       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的和。


       15.hdu 4638 Group

给你一个1~N的排列,问区间[L, R] 之间有多少段连续的数。比如区间里有3、1、2、5、6,这五个数,那么就有3、1、2和5、6这两段。


       16.hdu 4630 No Pain No Game

给出一个N和1到N的某个排列,询问Q次,每次询问[L,R]区间内任意挑两个数,最大公约数的最大值是多少。


题解报告仅有一些些.....只收集了某位大神的题


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值