Problem
查詢區間 hash 值、支持修改單一元素。
Sample Input
|
|
Sample Output
|
|
Solution
線段樹套用
|
|
查詢區間 hash 值、支持修改單一元素。
|
|
|
|
線段樹套用
|
|
給一個球球堆起的三角堆,抽走一顆球或者使其他球滑落到其他地方 (失去支撐),則所有落下、拿走的球將會是得到的分數。求最多能獲得多少分數。
|
|
|
|
面對三角堆,我們由左往右、由上而下考慮是否要將球移開,而這麼做很容易得到一個 O(n^3)
的做法,利用輔助數據壓縮在 O(n^2)
完成 (因為中間有一段迴圈是找後綴最大值)。
轉移的時候也很簡單,考慮兩種情況
在第二種可以發現,如果考慮左側高於自己的球球被移除的情況可以忽略不計。
|
|
給一堆單詞,問任意兩個單詞的最常共同前綴長為何。
|
|
|
|
對每一個單詞插入到 Trie 中,詢問任兩個字串的最長共同前綴時,相當於詢問兩個節點之間的最小共同祖先距離根多遠。
解決 LCA 問題,這裡採用離線 tarjan 做法。
|
|
有 N 種不同顏色的鈕扣,每一種燈泡分別有 $n_{i}$ 個,請問拿 M 個鈕扣獲得的組合類型有多少種。
|
|
|
|
組合問題,相當於計算以下式子的整數解。
$$x_{1} + x_{2} + x_{3} + .. + x_{n} = M \\ 0 \le x_{i} \le n_{i}$$事實上,利用 dp[i][j]
表示考慮前 i 種湊出 j 個組合數,得到 dp[i][j + k] += dp[i - 1][j] * C[j + 1 + k][k]
加入新種類的鈕扣。
|
|
附上一個 C++ 的版本,由於沒有使用 BigInteger 而 Wrong Answer.
|
|
給三角形三點座標,求通過三高三點和三邊中點的圓為何?
|
|
|
|
直接對三邊中點做外心即可。
|
|
二維平面中,給兩個點座標,以及一個 N,找到一個正 N 邊形,邊上通過這兩個點座標。求該正 N 邊形的最小面積為何?
|
|
|
|
最小面積的正 N 邊形,保證通過兩點一定在正 N 邊行的兩個頂點,而不會出現在邊上。
分開討論奇偶數,奇數直接是對角線,偶數則偏離一點。找到兩點與圓心(正 N 邊形外接圓)拉出的三角形,根據張開的角度計算外接圓的半徑即可。
|
|
依序參加派對,每一個派對要求的服裝可能有所不同,可以衣服一件套一件去參加下一場派對,一旦脫下來服裝將不會穿第二次,請問至少要準備幾件才能參與所有派對。
|
|
|
|
dp[l][r]
表示參與區間 [l, r]
從 l 開始的最少服裝數。
假設一開始已經穿著 l-th 的服裝,則將可以在參加完後脫掉,或者是到同一個另外一個場所之後考慮是否要脫掉。
|
|
有n个糖果,每个糖果有p,j两个值,现在有两个人Petra和Jan,Prtra的取糖果方式是优先去p值大的j值小的;Jan取糖果的方式是尽量让自己开心值(取出糖果的j值和)大的情况下让Petra的开心值(取出糖果的p值和)也大,给出先选糖果的人,问说最后两人的开心值分别为多少。
這裡可以明白有兩種策略
|
|
|
|
Petra 使用貪心,將糖果數值按照 P 降排序,來作為 dp 時候 Petra 轉移用的順序,只要確保 Petra 會根據這個順序從大挑到小。
並且確保前 i 個糖果時,Jan 不會拿超過 i/2 個糖果 (否則表示交替順序不符合規則),Jan 可以選擇先讓 Petra 分配到大的 P,而自己先去取大的 J。
dp[i][j]
表示前 i 個糖果,Jan 分配到 j 個的最佳策略 (J, P)。
|
|
原本是一張 DAG,增加一條有向邊會使得存有一個環,而這個環將會通過所有的點一次。
現在給予加完後的結果,是否存在一條有向邊,使得原本的 DAG 變成符合上述條件的圖。
|
|
|
|
由於只能通過所有點一次的環,對於 DAG 而言,替除掉應該加入的邊會發現到拓樸排序只能是唯一的長鏈狀。
因此窮舉拔掉所有可能的邊,並且檢查是否能夠符合長鏈狀的拓樸順序。
|
|
給一個 N 個城市的地圖,每一條路徑上會有成本和獲益,希望找到一條送貨的環道,是否存在一個環道使得獲益是成本的 P 倍。
|
|
|
|
最小比例環的應用,事實上可以把題目化簡為負環檢查,將每一條邊的權重定義為 expense * p - income
,只要負環存在則存有一條環道的 獲益/成本 > P
點數很少,直接用 floyd 在 O(n^3)
找解。
|
|