1. 程式人生 > >【轉載】線段樹題目2

【轉載】線段樹題目2

num ane 實用 ctu 運算 位置 元素 最大 nac

1.hdu1166 敵兵布陣
更新節點,區間求和。

2.hdu1754 I Hate It
更新節點,區間最值.

.
3.hdu1698 Just a Hook
成段更新,總區間求和.

.
4.hdu1394 Minimum Inversion Number
更新節點,區間求和

.
5.hdu1779 (這個爆炸了,別做了)
成段更新,區間最值

.
6.pku2777 Count Color
成段更新,區間統計,位運算加速

.
7.pku3468 A Simple Problem with Integers
成段更新,區間求和(中間乘法會超int)

.
8.pku2528 Mayor’s posters

成段更新,區間統計(離散化)

一個很惡心的題目,昨天晚上看了題意,上網了解了一下離散化。離散化就是為了縮短線段的範圍,如兩個線段(1,6)和(4,9),離散化一下就是1->1,6->3,4->2,9->4,那麽離散後的線段就是(1,3)和(2,4),把線段長度從(1,9)縮短到了(1,4),這種離散化是很實用的。離散的過程就是先把線段的坐標保存下來(1,6,4,9),再排序(1,4,6,9),之後對應(1->1,4->2,6->3,9->4),再根據這個對應修改原先的線段就好了。

.
9.hdu2795 Billboard
更新節點,詢問特殊

.

10.pku3667 Hotel
成段更新,尋找空間(經典類型,求一塊滿足條件的最左邊的空間)

.
11.hdu1540 Tunnel Warfare
更新節點,詢問節點所在區間(同上一道Hotel一樣類型的題目)

.
12.hdu2871 Memory Control
hotel變形題目,三個都函數一樣

.
13.hdu3016 Man Down
成段更新,單點查詢(簡單線段樹+簡單DP)

.
14.hdu1542 Atlantis
矩形面積並,掃描線法

.
15.hdu1255 覆蓋的面積
同上,掃描線法,我多加了一個系數csum,來統計覆蓋兩次的長度

.
16.hdu1828 Picture

掃描線,同面積統計,加了一個num_Seg統計一個掃描區域裏的邊

.
17.pku1436 Horizontally Visible Segments
成段更新,成段詢問

.
18.pku3225 Help with Intervals
成段更新,總詢問區間(有個異或操作比較新穎)

.
19.pku2482 Stars in Your Window
成段更新,區間最值 + 掃描線(中間二分的地方會int溢出)

.
20.pku2828 Buy Tickets
思維很巧妙,倒過來做的話就能確定此人所在的位置

.
21.pku2464 Brownie Points II
更新節點,區間求和 + 掃描線(用兩個線段樹沿著掃描線更新,然後按”自己最多,對方最少”的方案一路統計)

.
22.pku3145 Harmony Forever
查找一個區間內最左邊的數,詢問的val大的話用線段樹,小的話線性掃描

.
23.pku2886 Who Gets the Most Candies?
尋找區間中的左數第N個數,約瑟夫環(學到了反素數表,可以不用把所有數字預處理出來了)

.
24.pku2991 Crane
記錄了線段的兩端點以及轉過的角度,成段的轉,超有意思的題目,做了之後會對線段樹理解更深刻

.
25.hdu1823 Luck and Love
二維線段樹,題目和運用範圍都沒一維的廣,隨便找了道題目練習下就好

.

適合非遞歸線段樹的題目:

Codeforces 612D The Union of k-Segments : 題解
題意:線段求交,給定一堆線段,按序輸出被覆蓋k次或以上的線段和點。
基礎題,先操作,最後一次下推標記,然後輸出,
維護兩個線段樹,一個線段覆蓋,一個點覆蓋。

Codeforces 35E Parade : 題解

題意:給定若幹矩形,下端挨著地面,求最後的輪廓形成的折線,要求輸出每一點的坐標。

思路:雖然是區間修改的線段樹,但只需要在操作結束後一次下推標記,然後輸出,所以適合非遞歸線段樹。

URAL 1846 GCD2010 : 題解

題意:總共10萬個操作,每次向集合中加入或刪除一個數,求集合的最大公因數。(規定空集的最大公因數為1)

Codeforces 12D Ball : 題解

題意:

給N (N<=500000)個點,每個點有x,y,z ( 0<= x,y,z <=10^9 )

對於某點(x,y,z),若存在一點(x1,y1,z1)使得x1 > x && y1 > y && z1 > z 則點(x,y,z)是特殊點。

問N個點中,有多少個特殊點。

提示:排序+線段樹

Codeforces 19D Points : 題解

題意:

給定最多20萬個操作,共3種:

1.add x y :加入(x,y)這個點

2.remove x y :刪除(x,y)這個點

3.find x y :找到在(x,y)這點右上方的x最小的點,若x相同找y最小的點,輸出這點坐標,若沒有,則輸出-1.

提示:排序,線段樹套平衡樹

Codeforces 633E Startup Funding : 題解

這題需要用到一點概率論,組合數學知識,和二分法。

非遞歸線段樹在這題中主要解決RMQ問題(區間最大最小值問題),由於不帶修改,這題用Sparse Table求解RMQ是標答。

因為RMQ詢問是在二分法之內求的,而Sparse Table可以做到O(1)查詢,所以用Sparse Table比較好,總復雜度O(n*log(n))。

不過非遞歸線段樹也算比較快的了,雖然復雜度是O(nlog(n)log(n)),還是勉強過了這題。

掃描線題目:
POJ 1177 Picture:給定若幹矩形求合並之後的圖形周長 題解
HDU 1255 覆蓋的面積:給定平面上若幹矩形,求出被這些矩形覆蓋過至少兩次的區域的面積. 題解
HDU 3642 Get The Treasury:給定若幹空間立方體,求重疊了3次或以上的體積(這個是掃描面,每個面再掃描線)題解
POJ 2482 Stars in your window : 給定一些星星的位置和亮度,求用W*H的矩形能夠框住的星星亮度之和最大為多少。 題解

遞歸線段樹題目:
Codeforces 558E A Simple Task 題解
給定一個長度不超過10^5的字符串(小寫英文字母),和不超過5000個操作。

每個操作 L R K 表示給區間[L,R]的字符串排序,K=1為升序,K=0為降序。

最後輸出最終的字符串。

Codeforces 527C Glass Carving : 題解
給定一個矩形,不停地縱向或橫向切割,問每次切割後,最大的矩形面積是多少。

URAL1989 Subpalindromes 題解
給定一個字符串(長度<=100000),有10萬個操作。
操作有兩種:
1:改變某個字符。
2:判斷某個子串是否構成回文串。

HDU 4288 Coder : 題解
題意:對一個集合進行插入與刪除操作。要求詢問某個時刻,集合中的元素從小到大排序之後,序號%5 ==3 的元素值之和。
這題其實不一定要用線段樹去做的,不過線段樹還是可以做的。

HDU 2795 BillBoard : 題解
題意:有一個板,h行,每行w長度的位置。每次往上面貼一張海報,長度為1*wi .

每次貼的時候,需要找到最上面的,可以容納的空間,並且靠邊貼。

Codeforces 374D Inna and Sequence :題解
題意:給定百萬個數a[m],然後有百萬個操作,每次給現有序列加一個字符(0或1),或者刪掉已有序列中,第 a[0] 個,第a[1]個,...,第a[m]個。

Codeforces 482B Interesting Array: 題解
題意就是,給定n,m.

滿足m個條件的n個數,或說明不存在。

每個條件的形式是,給定 Li,Ri,Qi ,要求 a[Li]&a[Li+1]&...&a[Ri] = Qi ;

Codeforces 474E Pillar (線段樹+動態規劃): 題解

題意就是,給定10^5 個數(範圍10^15),求最長子序列使得相鄰兩個數的差大於等於 d。

POJ 2777 Count Color : 題解

給線段塗顏色,最多30種顏色,10萬個操作。

每個操作給線段塗色,或問某一段線段有多少種顏色。

30種顏色用int的最低30位來存,然後線段樹解決。

URAL 1019 Line Painting: 線段樹的區間合並 題解

給一段線段進行黑白塗色,最後問最長的一段白色線段的長度。

Codeforces 633H Fibonacci-ish II :題解

這題需要用到莫隊算法(Mo‘s Algorithm)+線段樹區間修改,不過是單邊界的區間,寫起來挺有趣。

另一種解法就是暴力,很巧妙的方法,高復雜度+低常數居然就這麽給過了。

樹套樹題目:
ZOJ 2112 Dynamic Rankings 動態區間第k大 題解
做法:樹狀數組套主席樹 或者 線段樹套平衡樹

Codeforces 605D Board Game : 題解
做法:廣度優先搜索(BFS) + 線段樹套平衡樹
Codeforces 19D Points : 題解

題意:

給定最多20萬個操作,共3種:

1.add x y :加入(x,y)這個點

2.remove x y :刪除(x,y)這個點

3.find x y :找到在(x,y)這點右上方的x最小的點,若x相同找y最小的點,輸出這點坐標,若沒有,則輸出-1.

提示:排序,線段樹套平衡樹

【轉載】線段樹題目2