1.Facebook Hacker Cup 2015 Round 1
2.Codeforces Round #286 (Div. 1)
其中,第二件可以說是徹底的失敗,兩個小時拿了0分。
目前知道除了我太廢以外,過度依賴std::map是一大失敗因素。
這裡就打一下FB Hacker Cup,比賽結果還沒公告,不過CF上有提供Judge的題目,我都過了。
1.Homework
因數倍數相關、範圍小、詢問多,從這些特徵,不難猜到要「建表」。
找到質數,把這個質數的所有倍數(包含本身)+1。
因為這題測資很弱,而且傳Output比賽,時限不會精確卡到,所以建完表對每筆詢問算一遍就會過了。
更進一步,可以發現在\(B\leq10^7\)下,\(K>8\)就不用處理了,
所以可以把\(K=1,2,...,8\)再預處理,做到時間複雜度\(O(N log log N +T)\)。
找到質數,把這個質數的所有倍數(包含本身)+1。
因為這題測資很弱,而且傳Output比賽,時限不會精確卡到,所以建完表對每筆詢問算一遍就會過了。
更進一步,可以發現在\(B\leq10^7\)下,\(K>8\)就不用處理了,
所以可以把\(K=1,2,...,8\)再預處理,做到時間複雜度\(O(N log log N +T)\)。
2.Autocomplete
題意比較難理解,其實就是在讀到字串\(S\)的時候,計算已經讀入的字串中,
跟\(S\)的最長共同前綴有多長,\(ans+=共同前綴長度+1;\),如果等於\(S\)長度,\(ans--;\)。
顯然trie支援如此詢問共同前綴並增加資料。
就這樣做一做,時間複雜度\(O(L)\),其中\(L\)為字串總長度。
跟\(S\)的最長共同前綴有多長,\(ans+=共同前綴長度+1;\),如果等於\(S\)長度,\(ans--;\)。
顯然trie支援如此詢問共同前綴並增加資料。
就這樣做一做,時間複雜度\(O(L)\),其中\(L\)為字串總長度。
3.Winning at Sports
兩種情況分開來做DP,狀態都是訂dp[自己得分][對手得分]。
我是用Top-down來做,基本上不難列轉移關係。
只要注意stressful的DP轉移過程與對手的最終的分有關,大可對每個\(T\)都重做一遍。
時間複雜度\(O(AB)\),\(A,B\)分別為自己與對手的得分。
我是用Top-down來做,基本上不難列轉移關係。
只要注意stressful的DP轉移過程與對手的最終的分有關,大可對每個\(T\)都重做一遍。
時間複雜度\(O(AB)\),\(A,B\)分別為自己與對手的得分。
4.Corporate Gifting
實際畫一下,會發現單一人的錢不會太大,實測不超過\(11\)。
不知道怎麼確切的卡上限,大可切個\(log_2N\),取\(20\),
理由:一個人的錢為\(x\)時,與其有關的人必定包含\(1,2,3,...,(x-1)\)的錢。
這樣卡得其實很寬,不過足夠了。
從沒有子節點的點開始,往上處理,記錄(這個點用\(x\)錢時,這個子樹的最小花費)。
(處理順序要確保:當一個點被處理時,其所有後輩都已處理完。)
依序往上就完成了! 時間複雜度\(O(N log N)\)。
如果用到遞迴,要小心自己電腦上的stack overflow,可以用以下編譯參數處理:
g++ -Wl,--stack=0x2000000
不知道怎麼確切的卡上限,大可切個\(log_2N\),取\(20\),
理由:一個人的錢為\(x\)時,與其有關的人必定包含\(1,2,3,...,(x-1)\)的錢。
這樣卡得其實很寬,不過足夠了。
從沒有子節點的點開始,往上處理,記錄(這個點用\(x\)錢時,這個子樹的最小花費)。
(處理順序要確保:當一個點被處理時,其所有後輩都已處理完。)
依序往上就完成了! 時間複雜度\(O(N log N)\)。
如果用到遞迴,要小心自己電腦上的stack overflow,可以用以下編譯參數處理: