luogup5017
noip (j.t4)
鳴謝:不認識的大佬的題解
有 n
nn 名同學要乘坐擺渡車從人大附中前往人民大學,第 i
ii 位同學在第t
it_i
ti分鐘去 等車。只有一輛擺渡車在工作,但擺渡車容量可以視為無限大。擺渡車從人大附**發、 把車上的同學送到人民大學、再回到人大附中(去接其他同學),這樣往返一趟總共花費m
mm 分鐘(同學上下車時間忽略不計)。擺渡車要將所有同學都送到人民大學。
凱凱很好奇,如果他能任意安排擺渡車出發的時間,那麼這些同學的等車時間之和最小為多少呢?
注意:擺渡車回到人大附中後可以即刻出發。
f [i
]f[i]
f[i]
表示以i
ii時間開始的最小等待總時間
s [i
]s[i]
s[i]
時間字首和
g [i
]g[i]
g[i]
個數字首和
f [i
]=mi
n(f[
j]+i
×(g[
j]−g
[i])
−(s[
i]−s
[j])
)(1≤
j≤i−
m−1)
f[i]=min(f[j]+i\times(g[j]-g[i])-(s[i]-s[j])\ )(1\leq j \leq i-m-1)
f[i]=m
in(f
[j]+
i×(g
[j]−
g[i]
)−(s
[i]−
s[j]
))(1
≤j≤i
−m−1)o(
t2
)o(t^2)
o(t2
)awsl
常數不管
−
>f[
i]=f
[j]+
i×g[
j]+s
[j
]->f[i]=f[j]+i\times g[j]+s[j]
−>f[
i]=f
[j]+
i×g[
j]+s
[j]−
>f[
j]+s
[j]=
−i×g
[i]+
f[i]
->f[j]+s[j]= -i \times g[i] +f[i]
−>f[
j]+s
[j]=
−i×g
[i]+
f[i]
k =−
ik=-i
k=−i
(注意是負數)
x =g
[j
]x=g[j]
x=g[j]
b =f
[i
]b=f[i]
b=f[i]
y =f
[j]+
s[j]
y=f[j]+s[j]
y=f[j]
+s[j
]−>y=
kx+b
->y=kx+b
−>y=
kx+b
(找i
ii的決策點時,f
if_i
fi若能o(1
)o(1)
o(1)
算出,當常數處理,f
jf_j
fj當變數)
然後斜率優化。。。
(維護凸殼,切點做最值決策點,加入隊中用斜率維護凸殼)
o (t
)o(t)
o(t)
#include
#define y(x) (dp[x]+s[x])
//一般手推
#define x(x) (g[x])
//推不來還是暴力dp吧
#define ll long long
using
namespace std;
const
int n=
4e6+
10,inf=
1e9;
int n,m;
int s[n]
,g[n]
;int dp[n]
;int z[n]
,p1,p2;
doublekt(
int i,
int j)
int ans=inf;
intmain()
for(
int i=
1;i<=maxx+m;i++
) s[i]
+=s[i-1]
,g[i]
+=g[i-1]
; p1=
1;p2=1;
for(
int i=
1;i)for
(int i=m;i<=maxx+m;i++
)printf
("%d"
,ans)
;}
斜率優化 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 如果把右邊...
斜率優化DP
斜率優化主要解決的是轉移方程中存在乙個同時與i和j有關的部分時的優化問題 dp i min dp j a i b j 0 include using namespace std typedef long long ll const int maxn 1e5 5 ll a maxn b maxn dp...