【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\) 维护连续段。
暴力设状态 \(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)\)。
状压 \(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\) 则是合法的。\
显然答案不超过 \(\log V\)。
设区间 dp \(f_{l,r,i}\) 表示区间 \([l,r]\) 已经进行 \(i\) 次操作后最大值的最小值。
转移是 \((\min,\max)\) 卷积。
区间分割和 \(b\) 的最小值有关,那么在 \(b\) 的笛卡尔树上做就好了。复杂度 \(O(n\log V)\)。
对 \(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)\)。
暴力背包:\(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)\)。
下面令 \(c_i\) 为原题的相反数。
如果 \(d_i\) 最大的技能满足 \(c_i\ge 0\),那么一直用这个就好了。
否则我们考虑将一些 \(c_i\ge 0\) 的技能和他组合,形成连招。
考虑连招的魔力值之和不会超过 \(2c\),如果超过了的话可以分成两个子连招。根据糖水不等式其中一定有一个是性价比更优的。
于是魔力值的前缀和在模 \(2c\) 意义下是两两不同的,否则中间的没有意义。令好的连招长度不超过 \(2c-1\),后面的部分和前面的题差不多。唯一不同是最后的零散的技能可以让怪兽血量为负数。
树上最大权独立集很好做,考虑更改一个点 \(u\) 权值等于更改每个临点转移的选择,做换根 dp。
设 \(g_u\) 表示两种选择的对称差,dp 的时候遵循 \(f\) 的转移即可。
统计柱形图,从小到大排序,面积为 \(n\),横着的连续段不超过 \(m\)。
将图形旋转 \(90^\circ\),横着的限制变为竖着的限制。容易前缀和优化。复杂度 \(O(n^2)\)。
浙公网安备 33010602011771号