Posted on 2009-11-14 21:41
王之昊 閱讀(1121)
評論(2) 編輯 收藏 引用
新的一個賽季的第一場比賽。回來的時候已經開始一段時間了,再者又是我一個人做,實在是提不起什么勁來。
總共10道題:牛逼的前三家,5個小時解掉8道題。仰慕
題目
|
大致意思
|
An Industrial Spy
|
枚舉 |
Common Subexpression Elimination
|
|
Divisible Subsequences
|
簡單DP |
Fractal
|
分形,復數
|
Mountain Road
|
動歸
|
Moving to Nuremberg
|
|
Room Assignments
|
|
Settlers of Catan
|
模擬 |
Simple Polygon
|
幾何 |
Wormholes
|
|
An Industrial Spy
注意數字最多7個,能表示的最大的數是999,9999 不超過10^7,所以直接刷一個表就可以了。
假設是8個數字能表示10^8-1,那就可能只能用快速判素數來做了
Common Subexpression Elimination
最多有5萬個節點,可以后序遍歷這棵樹,僅當左子樹和右子樹都用指針代替,這個樹才可能用指針代替。所以用遞歸寫起來很方便。
如果一棵樹的兩個兒子都是指針,這棵樹就可以表示為 name + left_child_id + right_child_id ,接下去要查找這棵樹之前有沒有出現,
用map 或者 hash 都可以。
5萬個節點。在自己電腦上標程unbuntu9.04能跑出答案,windows7暴棧
Divisible Subsequences
給你數字字符串長為n,求有多少個子串滿足該子串元素之和能整除d。
對于每個x(0<=x < n)計算每個sumx = a0 + a1 + ...+ ax,如果sumx 和 sumy 同余則說明存在一個合法的串。
Fractal
分形,涉及到旋轉縮放,用復數實現很方便。復數表示了二維點的所需信息,支持實數所支持的所有運算。旋轉縮放也可以理解成一個乘除法。可以說復數是很奇妙的擴充。
Mountain Road
dp, 狀態是dp[i][j][k] 表示從左邊已過 i 輛車,右邊已過 j 輛車, 最后一輛車從 k 方向過來。
dp[i][j][0] 的前繼是dp[i-x][j][1] (0 < x <= i)
dp[i][j][1] 的前繼是dp[i][j-x][0] (0 < x <= j) ,然后轉移即可。用順推更新后繼的寫法更快。
注意每輛車提供的兩個屬性為到達時間和路上
最小的花費,也就是說如果愿意的話可以在路上花費更多的時間。
Moving to Nuremberg
對樹搞一搞
Room Assignments
simple polygon
隨便選一個中心點(這里選原點),以其他點到該點的極角排序就得到了答案
Wormholes
題目大意一個特殊的存在負權的圖,求最短路。這個圖特殊在對于某條邊,當你的總花費低于某個限制時,這條邊會消失。這樣就不會存在一個無窮小的花費了。題目用蟲洞來描述,感覺相當有意思
解法不是很清楚,貌似是不斷松弛,不斷bellman-ford.但是復雜度怎么證明?