logo

yaohaoyou

春节

P16160 [ICPC 2016 NAIPC] Jewel Thief 题解

2026-07-15 Views 题解560字3 min read

题目传送器

物体体积种类数更少的 01 背包。

考虑使用 ss 较小的性质。显然对于体积相同的物品价值从大到小取,所以可以将每种体积分开做 01 背包。令 fi,jf_{i,j} 表示考虑前 ii 种体积,总体积为 jj 的最大价值,记录 ai,ja_{i,j} 表示体积为 ii 的物品中价值前 jj 大的价值和,显然 f(x)=ai,xf(x)=a_{i,x} 是上凸函数。有转移:fi,jfi1,jik+ai,kf_{i,j}\gets f_{i-1,j-ik}+a_{i,k},将 modi\bmod i 同余的取出来后,就是类似于 gjgjk+akg_{j}\gets g_{j-k}+a_k 的转移,因为 aka_k 为上凸函数,所以 gg 满足决策单调性。因为需要动态按顺序求 gg 来转移,可以使用 cdq 分治套决策单调性分治做到 O(kslog2n+nlogn)\mathcal O(ks\log^2n+n\log n),不太能通过,这里介绍一种简化 LARSCH算法。

简化 LARSCH 算法其实类似于 cdq 分治套决策单调性分治,令 optt(x)opt_t(x) 表示只考虑从 [1,t][1,t] 的转移到 xx 的最优决策,opt(x)=optx1(x)opt(x)=opt_{x-1}(x)。具体过程是定义 solve(l,r)solve(l,r) 表示已知 [1,l)[1,l)g,optg,optoptl1(r)opt_{l-1}(r),求解 [1,r][1,r]g,optg,opt

  1. i[opt(l1),optl1(r)]i\in [opt(l-1),opt_{l-1}(r)] 求出 optl1(mid)opt_{l-1}(mid),因为 optt(x)optt(y)optt(z),x<y<zopt_{t}(x)\le opt_{t}(y)\le opt_{t}(z),x<y<z
  2. 调用 solve(l,mid)solve(l,mid)
  3. opt(i),i[l,mid]opt(i),i\in [l,mid]optl1(r)opt_{l-1}(r) 求出 optmid(r)opt_{mid}(r)
  4. 调用 solve(mid+1,r)solve(mid+1,r)

这样就做完了,复杂度为 O(kslogn+nlogn)\mathcal O(ks\log n+n\log n)

EOF