原创 1036: [ZJOI2008]樹的統計Count (基於點的樹鏈剖分)

處理點的樹鏈剖分。支持單點更新,樹上求最值和樹上求和。 注意的地方: 記錄樹上的點在線段樹的位置的同時,也要記錄線段樹的某個位置是樹上哪個點。因爲線段樹建樹的時候是按照線性從左往右的,需要知道每個位置的點是哪個。 #include<io

原创 SPOJ 375. Query on a tree (基於邊的樹鏈剖分)

基於邊的樹鏈剖分,與點的幾個不同點: 1,維護邊權值,即是維護某點與其父親點之間邊的權值,所以可以等同視爲該點的權值(即孩子結點,可以通過判斷深度較大的是孩子結點)。 2,在LCA過程中,最後一步,在重鏈上求區間最大值,這裏的左端點實際上

原创 LeetCode273 Integer to English Words

將數字轉化成英語單詞。 分析單詞可以發現每1000之間是有規律的。 class Solution { public: string numberToWords(int num) { if(num==0)

原创 1500: [NOI2005]維修數列(Splay)

經典的題目,包含了Splay常見的操作:區間最值,區間求和,區間翻轉,區間改值等。 #include <iostream> #include <string> #include <cstring> #include <cctype> #

原创 USACO Section 2.3 Controlling Companies (迭代更新)

每次循環迭代,直到沒有更新控制的公司。 #include <iostream> #include <cstdio> #include <map> #include <vector> #include <string> #include

原创 HDU 1166 敵兵佈陣(區間求和+單點更新)

經典問題,對序列進行區間求和和單點更新操作。可用樹狀數組或線段樹或Splay實現。 我這裏使用了Splay。 #include <iostream> #include <string> #include <cstring> #includ

原创 4034: [HAOI2015]T2 (樹鏈剖分)

樹鏈剖分+線段樹區間更新和區間求和。 注意,一個子樹的所有點上的序號在線段樹上的位置是連續的,意識到這點這個題就是模版題了。 另外關於樹鏈剖分的細節,第二次遞歸的時候要先計算重邊對應結點否則會出錯。 線段樹中,push_down的部分注意

原创 LeetCode283 Move Zeroes

最容易想到的思路,先刪掉所有的0,然後再在尾部補0。 class Solution { public: void moveZeroes(vector<int>& nums) { int j=0; f

原创 USACO Section 2.4 The Tamworth Two (BFS模擬)

用三維數組保存運動物體第一次處於x、y座標和某方向時所用步數,同時記錄當運動物體的路徑和出現循環時的週期。這一步用BFS完成。 枚舉兩個運動物體路徑中的公共位置,根據情況分類討論。 有3種情況。 1,人和牛都處於循環路徑中。即判斷A+xa

原创 LeetCode290 Word Pattern

用兩個哈希表分別存放字符-單詞,單詞-字符。然後遍歷判斷是否出現衝突。 切割字符串可用strtok。 class Solution { public: bool wordPattern(string pattern, strin

原创 USACO Section 1.3 wormhole (暴力+模擬)

注意幾個地方。 1,暴力的時候要注意別算重複了。匹配是雙向的。 2,判斷迴路不能使用拓撲排序或弗洛伊德,因爲它的行動是有規則的:傳送以後只能往前走不能再相同位置傳回去,基於這個條件只能枚舉每個位置模擬判環。 #include <ios

原创 LeetCode284 Peeking Iterator

實現一個迭代器支持peek,next,hasnext。 其中next和hasnext直接使用繼承來的操作即可;peek要求返回數值又不刪除它,可以用一個臨時變量的next實現。 // Below is the interface for

原创 POJ1655 Balancing Act (樹的重心)

樹的重心:如果刪除某點以後,形成的所有子樹中,最大的子樹大小最小,那麼該點是樹的重心。 求樹的重心只需要一遍dfs即可,並不是什麼樹形dp。對於某個點,需要求出它所有的子樹大小,孩子結點直接遞歸計算就行了,它父親方向的結點個數等於樹結點總

原创 Convex hull trick算法介紹

http://www.rockzh.com/archives/57

原创 HDU 1561 The more, The Better(樹形DP)

經典的樹形DP。 先將多叉樹變成二叉樹,然後進行DP。 dp[i][j]表示以i爲根,可選j個時候的最優解。 #include <iostream> #include <cstdio> #include <cstring> #includ