線段樹題目總結

 

轉載自大佬的線段樹博客,留個紀念,開始準備重新刷線段樹了= =

 

 

       之前做了些線段樹相關的題目,開學一段時間後,想着把它整理下,完成了大牛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

       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就可以)。解題報告Here

       14.URAL 1989 Subpalindromes:給你長度爲N的字符串,有M個操作,操作有兩種類型(1)“change i a”,表示將第i個字符變成a,(2)“palindrome? j k”,詢問[j,k]的字符串是否構成迴文串。解題報告Here

       15.hdu 4777 Rabbit Kingdom:給N個數,有M個查詢,問區間[L,R]之間有多少個數與這個區間內的其他數都互質。解題報告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

       15.URAL 1855 Trade Guilds of Erathia:有N個城市,M個操作。城市形成一條鏈,下標分別從1到N,相鄰城市有一條道路相連,初始通過每條道路的費用爲0。有兩種類型的操作,(1)"change a b d",表示從城市a到城市b之間的每條道路的費用改變d(如果d大於0,增加,反之減少)。(2)"establish a b",表示查詢在城市a到城市b之間任意選兩個城市作爲道路的起點和終點,問通過這些道路的平均費用。解題報告Here

       16.hdu 4578 Transformation:給你一個數組,初始值爲零,有四種操作:(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。解題報告Here

       17.hdu 4455 Substrings:給定一個整數串,有Q組詢問,問這個串中長度爲W的子串中不同的數字之和爲多少。解題報告Here

       18.hdu 4614 Vases and Flowers:給定一個區間[0,N-1],初始時每個位置上的數字都是0,有兩種操作,1.在位置A開始尋找F(如果沒有這麼多,則有多少個就找多少個)個數值爲0的位置,把位置上的數修改爲1,並返回第一個和最後一個修改的位置。2.查詢區間[A,B]內1的個數,並把區間[A,B]每個位置上的數修改爲0。解題報告Here

       19.hdu 4747 Mex:給你N個數,枚舉所有的L和R,問由區間[L,R]之間的數構成的集合裏,哪一個數字沒有出現,如果有多個,找出最早的一個,設其爲x,求所以x的和。解題報告Here

       20.zoj 3724 Delivery:N個點,對於每個點i,都有一條連向i+1的有向邊,另外有M條其他的有向邊,有Q個詢問(U,V)求U到V的最短路。解題報告Here

       21.cf343D Water Tree:一棵樹有N個節點,有三種操作(1)“1 v",表示將以點v爲根節點的子樹全部賦值爲1,(2)"2 v",表示將點v以及點v的所有祖先節點全部賦值爲0,(3)"3 v",表示查詢點v的值。解題報告Here。解題報告Here

       22.URAL 1977 Energy Wall:有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清零。解題報告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

       11.hdu4419 Colourful Rectangle:給你10000個三種顏色的矩形,不同顏色的矩形相互覆蓋會形成不同的顏色,問形成的七種顏色的面積是多少。解題報告Here

       12.zoj 3521 Fairy Wars:平面上有N個子彈,每個子彈的座標已知,現在在距離點x0,y0爲R的圓內,所以的子彈都會變成冰塊L*L,並且在L*L範圍內的所有其他子彈也會變成冰塊,問,當連鎖反應結束時,變成冰塊的子彈數有多少。解題報告Here
       13.zoj 3525 Disappearance:有三維的空間裏有N個點(N<5000),要求用一個長方體LB*LW*LH去包圍一些點,使得長方體內的點的權值和最小。解題報告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

       15.hdu 4638 Group:給你一個1~N的排列,問區間[L, R] 之間有多少段連續的數。比如區間裏有3、1、2、5、6,這五個數,那麼就有3、1、2和5、6這兩段。解題報告Here

       16.hdu 4630 No Pain No Game:給出一個N和1到N的某個排列,詢問Q次,每次詢問[L,R]區間內任意挑兩個數,最大公約數的最大值是多少。解題報告Here

六、結語

        到這裏,終於把待續兩個字去掉了,當然,並不是以後不更新,只是現在不會再去專門找線段樹的題目做(雖然我知道還有很多,呵呵。。),只是遇到了纔會把它放進來。當時開始整理的時候,想說,如果整理完,也像NotOnlySuccess大神那樣到處打廣告,然後從學期初到一直到現在期末了,終於是按計劃整理完,結果也沒感覺太高興,或許是因爲感覺自己還很拙,也就不去打廣告了,屌絲,還是多做些題去,呵呵。明天要考試,下午陽光剛好照進宿舍,曬會太陽,上自習去好了。

        整理了這麼久,感謝UESTC_Fish學長及其他人的幫忙。by UESTC_shiqi614 

 

 

發佈了146 篇原創文章 · 獲贊 14 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章