這些日誌僅供以後防止自己出現過去犯過的錯誤,起到乙個註記的作用。若其他的acmer覺得有用的話,本人也感到欣慰~
最近一直在練線段樹,說說線段樹的「染色問題」和「計數問題」。比如poj的2155,level 2的一道題,入門二維線段樹,這道題一開始被我當成了染色問題。本來想用每個node去記錄這一段是0還是1,結果後來發現二維線段樹在x維度上標記沒法下傳。如果你第一維進的node不一樣,第二維的情況就全亂了。所以事實證明這個題應該用計數搞。
然後是1151,level 3的第一題,掃瞄離散線段樹,剛剛費了很大勁終於ac,得到很多exp。 首先就是這個該死的矩形面積。它的表示都是半開半閉的,比如10~12,12代表的那一點其實是開的,真正有效力的是10和11兩點,分別表示兩段長度為1的小段。不過你又不能把每個線段的右半邊全都-1,不然到線段樹那裡會出亂子。線段樹是相當離散的結構,如果按常規的「點樹」建樹的話,一旦有單段(12~12)這種東西被分出來,你說是給他計1呢還是計0呢?經試驗怎麼都不對。乙個重要經驗就是遇到這種問題不要用「點樹」而要真正用線段樹的第二形態「區間樹」。「區間樹」和「點樹」的區別有如下幾條:
1)建樹的時候,點樹的mid=(s+e)/2, 區間樹的mid=s+(e-s)/2,這是為了保證平衡;
2)點樹的最終結點為形如1~1的結點,即s==e,而區間樹的最終結點為形如2~3的結點,即s+1==e。
3)建樹的時候,點樹沒有重複的點,相鄰的節點都是1~2,3~4這樣,而區間樹為1~2,2~3這樣,有重複的,這是因為區間樹的右端點是虛的,這也和題目相對應。
4)更新的時候,點樹是if(s<=node[p*2].r)進入左子樹,而區間樹是s
前段時間還做了3277,也是level 2的題,離散掃瞄線入門,一開始用線段樹做,把我虐得夠嗆,也是因為當時不知道線段樹的兩個形態。這種問題應該選用區間樹做。
大約第一篇就這樣吧~
ACM練級日誌 POJ 1389
這個也是乙個矩形面積並的問題,和1151幾乎一模一樣,不同的是,資料範圍有點不同 1151是100個矩形,每個矩形的座標是小數,而這個是1000個矩形,每個座標在50000以內。50000這個數看上去還可以,連離散化都不用 1151因為是小數所以還必須得離散化 理論上複雜度是2000 log5000...
ACM練級日誌 模板的使用
最近碰上的幾個題目使我開始注意到模板的使用是多麼的有力。先是上週的微軟比賽第二場 當然我被淘汰了 第一題上來就是一道網路流 當然ac演算法是找增廣路 我可是一點網路流不會,但是恰好手頭有網路流的標程,於是借來一用,修改輸入輸出,然後就騙了10分 然後是劃分樹這個破玩意,我要是比賽的時候肯定寫不明白那...
ACM練級日誌 POJ 2318 叉積的簡單應用
最近開始學習計 keng 算 die 幾何,第一道入門題就是這道了。本題最核心的問題,就是如何判斷乙個點在直線 線段 的什麼位置。這一點叉積可以很容易地做到。設直線 線段 的向量為s e,詢問點為p,那麼我們只需要計算一下 s p x s e,如果大於0,說明s p 順時針旋轉會達到s e,等於0說...