苹果又又来讲课的记录

🍏 牛逼,yny 👎

扫描值域方法

以及插入虚树的小 trick。

  • 树上分配排列使得相邻点差 \(\le 2\)

这是容易的 dp。但是这个结构实在是极为特殊,所以有 \(O(n)\) 做法是可以理解的(虽然不会)

  • 桂花树

这是找到合适的顺序然后 dp。

  • QOJ9561

这是性质然后 dp。

  • AT_dwacon6th_prelims_e

这是锤子 dp。

背包的各类奇异搞笑做法

01 背包问题

  • 无价值,求是否可能体积和为 \(m\)

对于一个 \(m\):复杂度 \(O(nw)\)\(w=\max w_i\)

做法:找到 \(p\) 使得 \(\sum_{i\le p}w_i\in[m-w,m+w]\),那么思想是先选 \([1,p]\) 然后按某顺序(满足:按序从 \(p\)\(1\) 删除/不删除,\(p+1\)\(n\) 加入/不加入)调整使得中间 \(\sum\) 始终在 \([m-c,m+c]\) 之间,易见存在一种顺序是可以做到的。

那么设 \(f(i,j,k)=0/1\) 为左边删到了 \(i\),右边加到了 \(j\),是否可能和为 \(k\)。当然这是不够的。根据单调性设 \(g(j,k)\) 为欲达到 \(k\),最左边删除的东西的最大下标(即 \(i\) 最大值)。转移:

\[g(i-1,x)\to g(i,x),g(i-1,x)\to g(i,x+w_i) \]

\[\forall j\le g(i,x),j-1\to g(i,x-c_j) \]

第二行转移是瓶颈。然而,实际上只需枚举 \((g(i-1,x),g(i,x)]\) 内的 \(j\),因此达到了 \(O(nw)\)

对于所有 \([0,m]\)\(O(nm/w)\)\(O(nw\log^2n)\),即 bitset/FFT。

  • 01 背包问题

体积 \(w\),价值 \(v\),体积 \(\le m\)

\(O(nm)\) 即一般 dp。

\(O(nw\sqrt n)\):找到 \(p\) 使得 \(\sum_{i\le p}w_i\in[m-w,m+w]\),选上前 \(p\) 个,把体积/价值取反。把所有随机打乱依次加入,便只需保留 \([m\pm O(\sqrt n)w]\) 的结果。按照性价比保留前 \(p\) 个的界会更优秀。

\(O(wm)/O(wm\log m)\):把同体积的一起加入,设 \(f(i,x)\) 为加入了 \(1\sim i\),体积为 \(x\) 的答案。每次加入时,把 \(f(i-1,x)\) 第二维按 \(\bmod i\) 分类,每一类要做 \((\max,+)\) 卷积,注意卷积一边是凸的,若使用 SAMWK 获得 \(O(wm)\) 复杂度,否则决策单调性。

完全背包

  • 完全背包:无价值,问能否凑出 \(m\),求出 \([0,m]\)。设最小重量是 \(z\),采取同余最短路获得 \(O(nz)\) 复杂度。注意当 \(m>zw\) 时答案等于 \([\gcd \mid m]\)

这主要是由于裴蜀定理。还有完全背包常用(?)的原理:对于一个选取的体积序列 \(v\),若其长度 \(\ge z\),必然存在一区间和模 \(z\) 等于 \(0\),删去它在同余最短路上获得更优秀的解。这导出任何同余最短路的最优解都满足 \(\le zw\),而根据裴蜀定理在存在充分大的解当且仅当 \(g\mid m\),于是证毕。

  • 完全背包:体积 \(w\),价值 \(v\),体积和 \(\le m(m>w^2)\)\(O(nw)\)

设最优性价比的体积/价值是 \(w_1,v_1\)。则任何非最优物品个数 \(<w_1\),否则可以无伤转到最优。于是可以做对 \(w_1\) 取模的同余最短路。

  • 完全背包:体积 \(w\),价值 \(v\),体积和 \(\le m(m\le w^2)\)\(O(nm)/O(w^2\log w)\)

有结论:按性价比排序后得到体积序列 \(\lang w\rang\),最优选数个数序列 \(x\),其必然满足:

\[\forall p,\sum_{i=p+1}^n x_iw_i\le \left\lfloor\frac{3w^2}{p}\right\rfloor \]

然后暴力得到 \(O(w^2\log w)\) 复杂度。

还有 \(m\le w^2\) 的第二种做法:欲求 \(f_i\) ,分为 \(f_j,f_{i-j}\),一定可以把 \(j\) 控制在 \([i/2,i/2+w]\) 的范围内,这样每层做去得到 \(O(w^2\log w)\) 复杂度,似乎更有拓展性(如)。

  • 完全背包:体积 \(w\),价值 \(v\),体积和 \(\le m(m\le w^2)\),恰好选 \(k\) 个物品,\(O(w\log w)\)

TBC

多重背包

  • 无价值:体积 \(w\),个数 \(k\),要求和为 \(m\)\(O(n^2c^2\log c/w)\),求出 \([0,s]\) 答案。

\(s=\sum c_ik_i\),当然有 \(O(ns\log c/w)\) 的暴力,在 \(s\le nc^2\) 时采用之。

否则必然存在 \(k_p\ge c\)。于是 \([nc^2,s-nc^2]\) 内答案有周期 \(c_p\)。采用二进制分组+bitset 获得这样的复杂度。

证明:只需证明,若 \(x\) 可取出则 \(x\pm c_p\) 可以取出。先证明 \(x+c_p\)。若 \(p\) 未选完显然,否则(根据 \(s>nc^2\))一定存在某物 \(i\) 至多取了 \(k_i-c\) 个,把 \(p\) 交换到 \(i\) 上去之后即可。反过来是一样的。

  • 体积 \(w\),价值 \(v\),个数 \(k\),体积和 \(\le m\)

\(O(nm)\):一般做法。

\(O(n^2w^2)\):每个物品把 \(\min(w,k_i)\) 个拿出来跑 dp,随后对于最后的 dp 状态每个跑贪心取性价比最高的。

证明:根据调整,不会出现 \(i\)\(j\) 优,而 \(x_i\le k_i-w,x_j\ge w\),于是云云。

\(O(n^2w\log k)\):二进制分组。从 \(2^k\) 的大到小 dp,\(f(i,x)\)\(i\) 层,体积和为 \(2^ix\) 的价值和。由于剩余层物品总和不超过 \(2^inw\),只需保留 \(nw\) 状态。

\(O(n^2v\log k)\):对上面的做法换维处理。

树上背包

TBC

posted @ 2025-03-15 14:52  British_Union  阅读(49)  评论(2)    收藏  举报