Problem
N 個人圍繞一圈,每一個回合自身的分數為相鄰距離小於 D (不包含自己) 的權重總和 mod N。
請問在 K 個回合後,最大分數和擁有最大分數的人分別為何?
Sample Input
|
|
Sample Output
|
|
Solution
由於 K 很大,明顯地是一道矩陣 D&C。
把遞迴公式建造出來,可以在 O(N^3 log K)
時間內完成。
|
|
N 個人圍繞一圈,每一個回合自身的分數為相鄰距離小於 D (不包含自己) 的權重總和 mod N。
請問在 K 個回合後,最大分數和擁有最大分數的人分別為何?
|
|
|
|
由於 K 很大,明顯地是一道矩陣 D&C。
把遞迴公式建造出來,可以在 O(N^3 log K)
時間內完成。
|
|
現在有 R 個 Pizza 店,同一個時間接收到 N 筆訂單,每一個店負責處理一筆訂單,發送的成本為店家到訂單的曼哈頓距離。
求所有訂單送達的總時間最小值為何?
|
|
|
|
一開始以為是要求最後一個送達的時間最小化,二分下去才發現連範測都過不了。
建圖之後,用 KM 算法找最大帶權匹配 (費用最小就取負號),用最少費用流解也是可以。
|
|
給一串整數序列,請問有多少連續的區間,區間不包含重複的數字。
|
|
|
|
窮舉每一個點當作區間左端點,向左延伸的最遠的右端點必然非遞減。
掃描線計算右端點。效率 O(n log n)
。
掛上輸入優化、HASH 會來得更快。
|
|
給平面上 N 個不重複的點,有多少梯形可以由這幾個點構成?
|
|
|
|
先窮舉任兩個點拉起的線段 (let N = n*(n-1)/2
)。
針對線段斜率排序,接著將相同斜率放置在同一個 group。
對於每一個 group 的每一個元素計算有多少可以配對成梯形。
斜率相同,按照交 y 軸的大小由小到大排序。(左側到右側),由左側掃描到右側,依序把非共線的線段丟入,並且紀錄線段長度資訊。每一個能匹配的組合為 當前線段數 - 相同長度線段數
。
|
|
給一個 N 個點的樹圖,在點上放置植物保護所有的邊,每個點上最多放置一個植物,請問最少花費為何?
|
|
|
|
將樹轉換成有根樹,對於每一個 node 當成 tree 去做考慮。
狀態 dp[node][1:protect edge from parent, 0:none]
以 node 以下作為一個 subtree 的最少花費,並且是否已經保護通往父親的邊。
效率 O(n)
。
|
|
有一排樹,每個樹分別有 type
和 height
,現在要將其分團,
type
height
計算總花費最小為何?
|
|
|
|
藉由掃描線的思路,可以得知每一個樹的位置 i
,往左延伸最大多少內不會有重複的 type
。詳見 12890 - Easy Peasy 的技巧。
因此會得到公式 $dp([i]) = min(dp[j - 1] + max(height[k])), j \geq f(i), j \le k \le i$
dp[i]
:將前 i 個樹分團的最少費用。
計算這個公式需要 O(n^2)
,由於 n 很大,必須找一個優化將其降下來。
首先知道 f(i)
是非遞減函數 (會一直增加),單純看 i 時,dp[j - 1]
是固定的,但max(height[k])
會逐漸增加,如果能在 O(log n)
時間進行更新、詢問,複雜度將可以降至 O(n log n)
。
每個元素有兩個屬性 (a, b)
query(f(i), i)
: return min(A[k].a + A[k].b), f(i) <= k <= i
update(f(i), i, height[i])
: A[k].b = max(A[k].b, height[i])
左思右想仍然沒有辦法用線段樹完成它,至少是一個很 tricky 的花費計算。
有一個貪心的思路,考慮區間內的計算時,只需要找到嚴格遞減的高度進行更新即可,並非所有的可能進行嘗試。用一個單調隊列,只記錄 [f(i), i]
之間的嚴格遞減的高度資訊,接著每次需要窮舉單調隊列內的所有元素。
複雜度最慘還是 O(n^2)
,隨機測資下速度是快非常多的。
|
|
給平面上 N 個點,找一個最大矩形,使得矩形邊上有最多點個數。
|
|
|
|
先離散化處理,將所有點放置在 grid[100][100]
內。
接著窮舉上下兩條平行線,由左而右開始掃描,邊緣的個數為 V[U1] + V[U2] + H[R] - V[U3] + V[U4] + H[L]
,掃描時維護 V[U3] + V[U4] - H[L]
的最小值。
特別小心矩形的四個頂點的排容,上述的公式仍然不太夠。由於題目沒有特別要求正面積矩形,必須考慮共線上最多的點個數。
效率 O(n^2)
。
|
|
給 P 個隊伍、S 個賽區,每隊分別都有可以去的賽區,而每一個賽區最多容納 C 個隊伍。
請問參加的總隊伍數量最大為何?
|
|
|
|
建造 maxflow 模型,source - team - site - sink
即可完成。
不是說好 maxflow 不太會考的嗎?結果還是在泰國賽區出來了,雖然之前也噴過 mincost 最少費用流 …
|
|
盤面上放置許多 +
展開,保證寬高相同並且不會超出格子外部,同時每一個大小不超過 11。而十字中心不會被其他十字覆蓋,每一格會顯示被覆蓋幾次。
找到一種放置方法,復原盤面結果,如果有種放置方法,選擇一種字典順序最小的輸出。
|
|
|
|
論窮舉順序的重要性,將會導致速度的快慢。
原則上先把所有 1
的位置挑出,依序窮舉每一個 1
是否可以進行放置。每一次選擇放置時,先從最大的寬高開始嘗試,先塞掉大多數的盤面結果,否則速度會被拉下。
不確定這一題是否有很正統的作法,求指導。
|
|
給予每一個格子的得分,分數為鄰近九格的 L 個數 (1 個 1 分) 加上自己是否為 L (3 分),因此最低 0 分,最高 12 分。
保證只有唯一解。
|
|
|
|
不斷地刷新已知的可能結果,慢慢從邊緣開始向內侵蝕已知解。
要做整數線性規劃看來是不可能,用刷新的方式看看是否可以噴出解。
|
|