jzoj5347

tj:80pts:維護f[i][j]表示當前第i個方塊必須選,且選了j個的最優解,設w[i]為第i個方塊長度
則可以枚舉上次選了第k個方塊,則f[i][j]=max{f[k][j-1]+w[i]*(i-k)}
初值:f[i][1]=w[i]*i
100pts:記g[i]表示f[i][j-1],f[i]表示f[i][j],考慮每一次用g[i]得到f[i],首先將f數組清空
初值依然如上
考慮以前可以用來更新現在答案的2個點j,k什麼時候j比k優(k<j)(k<j),則g[j]+w[i](ij)>g[k]+w[i](ik)g[j]+w[i]∗(i−j)>g[k]+w[i]∗(i−k)
g[j]w[i]j>g[k]w[i]kg[j]−w[i]∗j>g[k]−w[i]∗k
所以g[j]g[k]>w[i](jk)g[j]−g[k]>w[i]∗(j−k) 除過去得到(g[j]g[k])/(jk)>w[i](g[j]−g[k])/(j−k)>w[i]
w[i]單調不增,考慮斜率優化,維護一个斜率單調遞減的隊列,保證其中所有斜率小於w[i],當sl(q[h],q[h+1])>w[i]時pop掉q[h]

转载于:https://www.cnblogs.com/rilisoft/p/10385271.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值