乙個n*m棋盤每格有乙個數字,用p個同半徑的已知圓心的圓覆蓋棋盤,求最小半徑使得覆蓋方格數字和不少於k。 1≤
n,m≤
1000,1
≤p≤10
9 求一些圓怎麼覆蓋棋盤,不如考慮方格怎麼會被圓覆蓋,所以可以求離方格最近的圓心。
先考慮一行內。求一行內每個方格距離最近的圓心的距離的平方,顯然正反掃兩遍即可。 令g
[i][
j]表示第i行到(i,j)最近圓心距離的平方。然後f
[i][
j]=min
那麼f[
i][j
] 就是在1i
行內距離(i
,j) 最近的距離了,倒過來做一下就可以知道全部得了。 但是f
[i][
j]要o(n
3)才可求得,考慮優化。發現形式是經典的斜率優化(實際上似乎很多求歐幾里得距離的dp都可以斜率優化)。然後針對每列開乙個單調佇列即可。
其實kd樹可能可以水很多分吧。。。
gdsoi t2。
Dp優化 斜率優化
該模板的ai要具有單調性,也就是sum陣列 若沒有單調性,加個二分即可 我的一篇題解,很詳細 1 寫出狀態轉移方程 2 按照斜率優化的式子推導出式子 3 代入模板即可。include include using namespace std typedef long long ll const int...
斜率優化 DP
我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...
dp斜率優化
我們知道,有些dp方程可以轉化成dp i f j x i 的形式,其中f j 中儲存了只與j相關的量。這樣的dp方程我們可以用單調佇列進行優化,從而使得o n 2 的複雜度降到o n 可是並不是所有的方程都可以轉化成上面的形式,舉個例子 dp i dp j x i x j x i x j 如果把右邊...