然而絲之鴿還是沒有出
兩個平行的線,上面連線著若干條弦,第i
ii條連線上方的x
ix_i
xi個下方的y
iy_i
yi。
然後每次可以選擇乙個位置(i,
j)
(i,j)
(i,j
),可以切斷任何位於位置(u,
v)
(u,v)
(u,v
)的弦僅當滿足條件(
u>i,
v (u>i,v(u >i, v,消耗代價為ai∗ bj a_i*b_j ai∗bj 。求切斷所有線的最小代價。 如果我們將下面那條線翻轉過來,我們就有條件( u>i, v>j) (u>i,v>j) (u>i, v>j) ,我們將弦看成座標的話,我們可以發現其實就是每次選擇乙個點然後將右下角的點都去掉。 所以就有以下優化 如果乙個弦代表的點在其他弦代表點的右下角,那麼該點不影響結果。可以去掉 如果乙個點的代價比他右上角的其中乙個點的代價高,那麼必定選那個點更優。所以我們可以對於a aa和b bb都取乙個字首min minmi n做完以下優化後,對於弦我們可以求到x xx遞增,y yy遞減的序列。轉換到之後就是a xa_x ax遞減,b yb_y by遞增的序列,可以進行dpdp dp。fi= mi nf_i=min\b_\} fi=mi n考慮斜率優化 f i= fj+a xj+1 by if_i=f_j+a_b_ fi=fj +ax j+1 byi 轉換成函式 f j= −axj +1by i+fi f_j=-a_b_+f_i fj=−a xj+ 1by i+ fi 斜率為−by i-b_ −byi 要求截距最小,維護下凸殼(斜率遞增)。 然後因為都是單調的,可以用單調佇列維護。#include
#include
#define ll long long
using
namespace std;
const ll n=
3e5+10;
struct nodea[n]
;ll n,m,q[n]
;double x[n]
,y[n]
,f[n]
;bool
cmp(node x,node y)
double
slope
(ll i,ll j)
intmain()
printf
("%.0lf"
,f[m]);
}
DP優化方法之斜率DP
什麼是斜率dp呢 大概就把一些單調的分組問題 從o n 2 降到o n 具體的話我就不多說了 看 我自己也補充幾句 其實斜率dp有很多種打法 有凸包 有截距 有直接比較斜率的 因為我比較弱 所以的話就學最弱智的比較斜率的 聽wph說截距很好理解 然後的話 講課的時候scy說什麼要證單調性什麼鬼的 我...
學渣亂搞系列之dp斜率優化
學渣亂搞系列之dp斜率優化 by 狂徒歸來 下面看乙個例題print article。連續列印一段長達從i到j的的文章,需要m sigma sum j sum i 2的費用,求列印完這篇文章的最小費用。到底分多少次去列印,費用最低呢。dp i 表示列印從1.i的最小費用。那麼我們有dp轉移方程dp ...
bzoj3437 小p的牧場 斜率優化dp
背景 小p是個特麼喜歡玩mc的孩紙。描述小p在mc裡有n個牧場,自西向東呈一字形排列 自西向東用1 n編號 於是他就煩惱了 為了控制這n個牧場,他需要在某些牧場上面建立控制站,每個牧場上只能建立乙個控制站,每個控制站控制的牧場是它所在的牧場一直到它西邊第乙個控制站的所有牧場 它西邊第乙個控制站所在的...