【A】背包专题

  • 暴力设状态然后优化转移。
  • 对于最小化的背包,前缀和在模意义下两两不同。

[ARC187D] Many Easy Optimizations

设计 dp 状态:\(f_{i,j}\) 表示选了前 \(i\) 个数,最小值为 \(j\) 时的最小最大值。
考虑转移:\(f_{i,\min(a_i,j)}\leftarrow \max(f_{i-1,j},a_i)\),其中转移是取 \(\min\) 操作。
分类讨论:

  • \(j\le a_i\),那么 \(f_{i,j}\leftarrow \max(f_{i-1,j},a_i)\)
  • \(a_i<j\le b_i\),那么 \(f_{i,j}\leftarrow \max(f_{i-1,j},b_i)\)
  • \(b_i<j\)\(f_{i,j}=+\infty\)

维护考虑用 \(set\) 维护连续段。

[PA 2020] Malowanie płotu

暴力设状态 \(f_{i,l,r}\) 表示第 \(i\) 行涂了 \([l,r]\) 的方案数。
相邻两个段必须有交,考虑容斥减去不相交的方案。
\(L(i,j)\) 表示第 \(i\) 行涂了 \([1,j]\) 的子区间的方案数,\(R(i,j)\) 表示涂了 \([j,m]\) 的子区间的方案数。那么 \(f_{i,l,r}=L(i-1,m)-L(i-1,l-1)-R(i-1,r+1)\)
直接维护 \(L\) 就好了,由于对称性,只用维护一个。复杂度 \(O(nm)\)

[JOI 2025 Final] 只不过是长的领带 2

状压 \(b\) 中每个数有没有出现,那么 \(f_{i,0/1,s}\) dp 即可,复杂度 \(O(n2^k)\)
考虑加速,如果 \(a_i\in s\),那么 \(s\) 是不会变的。
那么 \(s\) 增加一定是遇到了相邻的 \(a_i,a_{i+1}\not\in s\),设 \(g(s)\) 表示 \(s\) 最后一次出现的位置,如果 \(g(s)\ge n-1\) 则是合法的。\

Kevin and Math Class

显然答案不超过 \(\log V\)
设区间 dp \(f_{l,r,i}\) 表示区间 \([l,r]\) 已经进行 \(i\) 次操作后最大值的最小值。
转移是 \((\min,\max)\) 卷积。
区间分割和 \(b\) 的最小值有关,那么在 \(b\) 的笛卡尔树上做就好了。复杂度 \(O(n\log V)\)

[AGC026D] Histogram Coloring

\(h_i\) 底下共有的行做 dp,然后递归子问题。
对于有相邻的同色格子,方案数是 \(1\)。否则为 \(2\)
考虑按这个分两类,做 dp。
如何从子问题合并过来:

  • \(f_0\leftarrow f_0\times g_0\)
  • \(f_0+f_1\leftarrow (f_0+f_1)\times(2g_0+g_1)\)

对于空列,转移是:

  • \(f_0\) 不变。
  • \(f_0+f_1\leftarrow 2(f_0+f_1)\)

合并完后 \(f_0\) 就乘个 \(2^{\min-1}\) 即可。

[BalticOI 2022] Uplifting Excursion (Day1)

先缩小 \(l\),因为要尽量多拿物品,先考虑全部的物品都拿了,如果拿的权值多了就从 \(m\) 开始放回去,否则从 \(-m\) 开始放回去。最后 \(l\) 的范围可以缩小到 \([-m,m]\)
然后缩小 \(a\),逐个加入 \(a\),一定存在一个加入顺序使得当前权值总和在 \([0,2m)\),由于同一个总和经过两次是没有意义的,所以接下来总共加入的物品数是 \(2m-1\) 个的,即值域不超过 \(m^2\)。总的复杂度为 \(O(m^3)\)

「雅礼集训 2017 Day5」珠宝 /「NAIPC2016」Jewel Thief

之前百万放过?按 \(c_i\) 分组,然后如果要买价值为 \(x\) 的物品则一定是 \(c_i=x\) 的珠宝按 \(v_i\) 从大到小排序后的一段前缀。设 \(s_{i,j}\) 表示 \(c_p=i\) 的物品中前 \(j\) 个物品的吸引力,则 \(s_i\) 是凸函数。
\(f_{i,j}=f_{i-1,j-kc_i}+s_{i,k}\),普通函数和凸函数做 \((\max,+)\) 卷积,用分治决策单调性做即可。复杂度 \(O(kc\log k)\)

Gellyfish and Mayflower

暴力背包:\(O((n+m)r+q)\)
考虑“性价比最高的物品”,假设他是 \((c_{\max},w_{\max})\),猜它会被取很多个。具体地,代价取到 \(c^2\) 时,以后的物品都会取 \((c_{\max},w_{\max})\)

  • 证明:考虑如果其他的物品的代价和为 \(c_{\max}\) 的倍数,那么一定会被替换为 \((c_{\max},w_{\max})\)。所以对于背包,每个时刻的代价和在 \(\bmod\ c_{\max}\) 后一定互不相同,那么到了取了 \(c\) 个其他物品则一定会出现相同。

指定性价比最高的是哪个,然后暴力跑背包。复杂度 \(O(n(n+m)c^2+qn)\)
考虑优化,对于查询:

  • \(r\le {c_{\max}}^2\):跑第一个暴力。
  • \(r>{c_{\max}}^2\):我们只在乎 \(r\bmod c_{\max}\),对他 dp 就好。

\(f_{u,i,0/1,r}\) 表示当前在点 \(i\),钦定最大的 \((c_{\max},w_{\max})\) 为点 \(u\),是否走到过 \(u\)\(r\) 在模 \(c_{\max}\) 意义下的值。答案查询 \(\max_{u}\{f_{u,p,r\bmod c_u,1}+\left\lfloor\frac{r}{c_u}\right\rfloor\times w_u\}\)
跑同余最长路,转移的边权为了消掉全部钦定成 \(c_{\max}\) 的影响,需要写成 \(w_i-\left\lfloor\frac{r+c_i}{c_u}\right\rfloor\times w_u\)
复杂度 \(O(n(n+m)c+(n+m)c^2+qn)\)

类似的题 P9140

[ABC310Ex] Negative Cost

下面令 \(c_i\) 为原题的相反数。
如果 \(d_i\) 最大的技能满足 \(c_i\ge 0\),那么一直用这个就好了。
否则我们考虑将一些 \(c_i\ge 0\) 的技能和他组合,形成连招。
考虑连招的魔力值之和不会超过 \(2c\),如果超过了的话可以分成两个子连招。根据糖水不等式其中一定有一个是性价比更优的。
于是魔力值的前缀和在模 \(2c\) 意义下是两两不同的,否则中间的没有意义。令好的连招长度不超过 \(2c-1\),后面的部分和前面的题差不多。唯一不同是最后的零散的技能可以让怪兽血量为负数。

「Stoi2025」爱在西元前

树上最大权独立集很好做,考虑更改一个点 \(u\) 权值等于更改每个临点转移的选择,做换根 dp。
\(g_u\) 表示两种选择的对称差,dp 的时候遵循 \(f\) 的转移即可。

[ABC221H] Count Multiset

统计柱形图,从小到大排序,面积为 \(n\),横着的连续段不超过 \(m\)
将图形旋转 \(90^\circ\),横着的限制变为竖着的限制。容易前缀和优化。复杂度 \(O(n^2)\)

posted @ 2025-09-06 16:30  TallBanana  阅读(8)  评论(0)    收藏  举报