Problem
給予 AND, OR, NOT 結合的電路圖,保證最多 26 個變數,分別由大寫字母表示,接著對於每一組詢問輸出電路結果。
Sample Input
|
|
Sample Output
|
|
Solution
不想轉化成 graph,那麼就直接針對盤面做遞迴分析,特別要記錄之前的方向位置,以免電路接錯路徑。而題目沒有說明 ?
銜接的方向,有可能四個方向都有。一開始沒有注意到這個問題,導致刷了很多 RE。
|
|
給予 AND, OR, NOT 結合的電路圖,保證最多 26 個變數,分別由大寫字母表示,接著對於每一組詢問輸出電路結果。
|
|
|
|
不想轉化成 graph,那麼就直接針對盤面做遞迴分析,特別要記錄之前的方向位置,以免電路接錯路徑。而題目沒有說明 ?
銜接的方向,有可能四個方向都有。一開始沒有注意到這個問題,導致刷了很多 RE。
|
|
給定一個方程式,接著繞 x 軸旋轉,計算區間 [l, r]
的體積。
考慮積分與數值積分的情況,計算兩者之間計算的誤差。其中會給定數值積分在 x 軸劃分的依準,以及繞行 x 軸轉換要切幾等分。
|
|
|
|
這題最麻煩就是計算椎台體積
在幾何學中,錐台又稱平截頭體,指的是圓錐或稜錐被兩個平行平面所截後,位於兩個平行平面之間的立體。根據所截的是圓錐還是稜錐,可分為圓台與稜台。
參照 wiki Frustum
兩平行的上下底面積 S1, S2,根據高度 h,得到體積 V = (S1 + S2 + sqrt(S1 * S2)) /3 * h
。之後就模擬劃分計算體積。
|
|
給定一些學生的成績,希望建造一個分級制度,使得每一級的人數差距越少越好。
分級制度化分成 A, B, C, D 四級,每一級都是一個連續區間,假設現在有 N 個人,期望能將每一堆分成 N/4 個人,把每一堆人數與期望的 N/4 的差總和越小越好。
輸出字典順序最小的劃分方式。
|
|
|
|
如何直接窮舉劃分線,想必也要消耗 O(160^3) 的時間。這花費太昂貴。
發現到每一個人的分數並不高,落在 0 - 160 之間的整數,那麼先統計每個分數有多少人。
接著考慮 dp[i][j]
前 i 個分級制度,劃分線為 j 的最小差總和。接著加入下一級,得到
|
|
因此需要 O(4 * 160 * 160)
來完成。考慮輸出最小字典順序的劃分方式,一樣採用 dp 的思路,逆推回去查看是否能得到目標的最佳解,之後再順著被標記的路線走即可。
|
|
每一個主字串,接著根據一大堆規則, 依序 將字母做替換。
|
|
|
|
由於主字串可能很長,不用針對每次詢問將每一個主字串都拿來修改。只需考量每一種字符轉換的可能,例如源頭 ‘A’ -> ‘Z’, ‘B’ -> ‘X’, ‘C’ -> ‘Z’, … 那麼,接下來遇到 ‘Z’ -> ‘W’,只需要針對 ‘A’ -> ‘W’, ‘C’ -> ‘W’ 即可。
因此,每一次詢問最多消耗 O(26) 完成。
|
|
寒冷的冬天,為街道上的人鋪設毛毯,現在有 n 個無限長毛毯,每一個毛毯都有其紋路,呈現厚薄厚薄厚薄 … 的順序,其中厚的長度為 ai,而薄的長度為 bi - ai。
現在長度為 1…m 的街道,請問蓋到 1 件、2 件、3 件、 …、n 件薄毛毯的人分別有多少人。
|
|
|
|
看到 ai, bi <= 16。
窮舉每個人,O(16)
計算蓋到幾件薄毛毯。
如果用 O(nm) 顯然太慢,由於 bi 很小,針對所有可能,預建表得到循環下累計結果。
|
|
有一套撥花瓣遊戲,一朵花有 n 片花瓣,每一片花瓣分別位置在 1…n,呈現環狀,首尾相連。兩個人輪流撥花瓣,每一次撥一片、或者撥相鄰的兩片,最後一個取走花瓣的人輸。
給已經撥去花瓣,請問現在她先手會不會勝利?
|
|
|
|
看出是一道 SG 博奕遊戲,假設有 n 個連續花瓣,取中間一片、或連續兩片,將會變成兩段連續花瓣,藉此建造 SG 函數,求出連續 n 個連續花瓣的 SG 值,隨後統計有多少段連續花瓣,並且各自擁有多少花瓣,接著套用 nim 遊戲得到結果。
特別小心是環狀的,題目沒有描述得很清楚。
|
|
給定一個主字串 S,接著數筆詢問有多少不同的子字串以 X 開頭、Y 結尾。
|
|
|
|
由於題目是要找不同的子字串,必然會造成比對速度上的問題,由於主子串長度最多 1000,而詢問的 X、Y 長度都小於 10,顯然地窮舉是相當有利。但是詢問次數最多 50000,窮舉起來必須有效率地映射到答案中,因此建議離線把詢問建成一個 Trie,同時避免重複的詢問。
窮舉每個子字串,為了加速匹配,最多跑 O(len * len * 10 * 10)
,當決定子字串為 [l, r]
時,遞增起頭指針、遞減結尾指針,對於每一組詢問串成 X#inv(Y)
,那麼只需要循序走訪一棵 trie,如此一來速度就提升了不少。
接著考慮如何去重複,關鍵點在於窮舉每個子字串,也依序插入 trie 中,當有新增新的節點時再進行答案的驗證。
也許這類型的題目可以先建造一個 suffix tree,然後想辦法詢問,仔細想想不容易就放棄。
|
|
現在有位歌手,要舉辦演唱會,在各地的百貨公司打算邀請歌手來演唱,藉以吸引更多的顧客來消費。每個百貨公司提供在哪一天歌手來演唱時可以得到的獲益,歌手必須自費從另一個地點到另一個地點,因此會給定兩地之間的自費費用。可以留在原地。
求歌手在 m 天內可以獲得的最大利益為何,假設第一天到任何場地都是 0 花費,沒有指派最後一天所在的位置。
|
|
|
|
定義狀態 dp[stores][days]
,在第幾天到哪一個城鎮。
|
|
N 個人不同高,現在佔一排,任挑三個人的身高從左向右的相對高度,不存在矮、高、中的情況有多少種。
|
|
|
|
卡塔蘭數 (Catalan number)。
每一次考慮加入一個最高的人,窮舉最高的人應該佔在哪個位置,則其左、右側也要滿足定義,同時左側的人都要比右側的人高。最後得到公式如下,與卡塔蘭數相同。
|
|
有 N 個人的愛書俱樂部,他們會喜歡某些人的書,如果相互喜歡對方的書就可以進行交換,現在要問的是否每個人都能找到能夠交換的對象,讓每個人都獲得新書。
如果 A -> B, B -> C, C -> A,那麼他們可以環狀地交換新書。
|
|
|
|
每個人只能找一個對象進行交換,找二分圖的 perfect matching。
二分圖中左側是每個人,右側是想要交換的對象,兩邊的個數都是 N。匹配完會找到數個環狀,這就是最後的交換情況。然而由於點數很多,用匈牙利算法可以減枝來加快,每一次擴充路徑都必須得成功。如果使用 maxflow,則盡可能減少邊的無效使用。
當然可以使用 maxflow 貪心預流、匈牙利貪心匹配過後,再套用算法,速度有可能會快上許多,以下的模板還真好用,減少無效使用於分層圖,所以速度快上很多。
|
|