bzoj1010 玩具裝箱toy 斜率優化dp

2022-05-20 08:22:36 字數 1559 閱讀 4150

題目鏈結

第一道自己推的斜率優化dp><

首先要明確一點:裝進同乙個容器的toys一定要是連著的幾個(否則的話可以直接貪心)-->之前理解錯題意wa了一次......

用sum[i]表示字首和,f[i]表示前i個裝進容器的最小費用,

容易知道

f[i]=max(f[i],f[j]+(sum[i]-sum[j]+i-(j+1)-l)2)(j

令kf[k],則需要滿足:

f[j]+(sum[i]-sum[j]+i-(j+1)-l)2

2令t[i]=sum[i]+i,則移項,可得:

f[j]-f[k]+(t[j]-t[k])*(t[j]+t[k])<2(t[i]-l-1)(t[j]-t[k])

即:(f[j]-f[k]+t[j]2-t[k]2)/(t[j]-t[k])<2*(t[i]-l-1)

g[i]=f[i]+t[i]2

,則有(g[j]-g[k])/(t[j]-t[k])<2*(t[i]-l-1)。

用s(i,j)表示i到j連線的斜率,

對於乙個單調佇列,每次對於隊首,若s(q[h],q[h+1])<2*(ti-l-1),則此時的q[h]一定不會是現在和以後的最優解,h++;

對於隊尾,若s(q[t-2],q[t-1])>s(q[t-1],i),如果s(q[t-2],q[t-1])<2*(t[i]-l-1),則s(q[t-1],i)<2*(t[i]-l-1),由i>q[t-1]可知此時i比q[t-1]要優;如果s(q[t-2],q[t-1])>2*(t[i]-l-1),則q[t-2]要比q[t-1]優。所以無論如何q[t-1]都不會是最優解,此時t--。

接著就是斜率優化dp的套路了:

1 #include2 #include3 #include4 typedef long

long

ll;5

const

int maxn=5e4+5;6

using

namespace

std;

7ll a[maxn],q[maxn],sum[maxn],g[maxn],t[maxn],f[maxn];

8inline ll read()912

while(c>='

0'&&c<='9')

13return anss*f;14}

15 inline double

cal(ll a,ll b)

1619

intmain()

2029

int h=0,ta=1;q[0]=0;30

for(int i=1;i<=n;i++)

3138 printf("

%lld

",f[n]);

39return0;

40 }

bzoj1010

BZOJ1010 玩具裝箱toy

1010 hnoi2008 玩具裝箱toy time limit 1 sec memory limit 162 mb submit 7631 solved 2924 description p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓縮,其可以將任...

BZOJ1010玩具裝箱Toy

p教授要去看奧運,但是他捨不下他的玩具,於是他決定把所有的玩具運到北京。他使用自己的壓縮器進行壓 縮,其可以將任意物品變成一堆,再放到一種特殊的一維容器中.p教授有編號為1.n的n 件玩具,第 i件玩具經過壓縮後變成一維長度為ci 為了方便整理,p教授要求在乙個一維容器中的玩具編號是連續的。同時如果...

BZOJ1010 玩具裝箱toy

題目鏈結 bzoj1010 題目大意把n 個數分成若干段,從i到 j 分為一段的花費co st i j jk iva l k j i 求最小花費。分析 1.斜率優化dp,dp i min dp j co st j 1 i 2.先把l 1 設f x xk 1 val k x ff x d p x f ...