2024集训D9总结
集训D9总结
讲课内容主要是题 , 涉及的东西都比较常规 , 就不单独总结 .
题目训练
P4141
撤销一个物品的计数背包 . 考虑前后缀卷 , 复杂度 \(O(nm^2)\) . 考虑计数背包可以撤销 , 对每个物品考虑撤销 , 复杂度 \(O(nm)\) .
P2371
同余最短路 . 跑圈即可 .
P8392
相当于一个极大的多重背包 . 考虑物品有正有负 , 可以尝试先贪心地尽可能选负的 , 感觉上这样比较优 , 然后再调整 .
更精细地思考 . 事实上贪心的是尽可能逼近 \(L\) , 那么就先选上所有东西 , 多了就贪心地扔正的 , 否则贪心扔负的 .
这时需要调整的背包值域显然 \(\le m\) , 看起来直接多重背包就十分可做 . 为了调整这 \(m\) 的差 , 显然同一种最多要 \(m\) 个直接多重背包 , 用二进制分组 , 复杂度 \(O(m^3\log m)\) .
P4322
一眼分数规划 , 拆开后变为树上背包直接做 . $O(n^2\log n) $ .
Loj6039
见 [题目记录]一本通高手训练-交换 - youlv - 博客园 . 原来是原题 . 用另一个角度去看 , 对于每一种体积的物品处理时 , 具有显然的决策单调性 , 不用四边形不等式 , 这可以显然的从用一个不增序列关系这一点看出 . 因此事实上原做法就是一种二分队列 . 只不过当时写的时候直接考虑硬找单调性 .
这也说明决策单调性相关思路并不是局限在证明四边形不等式上 . 用找分界点 , 甚至打表都可以 .
loj的数据没我造的强 , 我过loj最大点312ms , 自己数据1.32s
P6563
这道题的 \(n^3\) 区间 dp 十分显然 , 考虑优化 .
看起来有决策单调性 , 甚至不多想 , 会认为这是一个有连续性的强决策单调性 . 写一个发现过不了 .
很可惜 , 这道题并没有决策单调性 . 考虑脚踏实地 , 回到 dp 式上考虑 :
\(\max\) 套 \(\min\) 是不好的 , 考虑单独研究 \(f_{i,k}\) 与 \(f_{k+1,j}\) 贡献的时刻 . 确定 \(i\) 或 \(j\) 不动 , 发现这两种情况的临界点具有单调性 . 这是好的 , 单独考虑每一种即可 .
题目给了 \(a_i\) 单调不减 , 因此 \(f_{k+1,j}+a_k\) 这种贪心选可行的最小 \(k\) 就行 . 另一部分发现不单调 , 但是边界移动是单调的 . 简单维护单调队列即可 .
是一道难度中等的好题 , 可惜提前剧透和先入为主太多了 , 没做出感觉 .
CF713C
首先单调增不好 , 考虑变为 \(a_i-i +n\) 转化为单调不降 , 这是好的 . \(+n\) 是为了保证符号为正 , 方便操作 .
设 \(f_{i,v}\) 表示考虑到 \(a_i\) , 最后一位是 \(v\) 的最小代价 , 转移是显然的 .
因为之前做过 "焰火表演" , 发现这个模型是符合直线复合成的凸函数这一模型的 , 这个模型的特点是可以用横坐标点值的集合表示函数 (首段斜率 , 截距需要额外记录) . 这个函数的优点是两个函数的相加可以直接合并点值集合 , 斜率保证等差数列 . 一般用堆维护 , 用可并堆还可以实现更复杂的操作 .
具体考虑这道题 , 对于一个点来说 , 代价函数是一个 "V" 字型 ,设零点 \(x\) , 表示法是 \(\{x,x\}\) , 表示在 \(x\) 处斜率 \(-1\to 0 \to 1\) . 更新时取得是一个前缀 , 对这个函数去前缀 \(\min\) 相当于把后半部分斜率为正的删除 , 保留到 \(k=0\) . 每一步复合后正斜率只有一个 \(1\) , 每次加入两个 \(x\) , 再取出一个最大值即可 .
考虑确定截距以取得答案 , 一种方法是更新同时维护 . 更简便的方法是直接带入一个特值进去 , 比如 \(x=0\) , 显然有 \(y=\sum a_i\) , 斜率为零处就是答案 .
P3642 焰火表演
这题和上一题应该反过来做 ......
发现这道题类似于把上一道题搬到树上 , 同样地分析函数的变化 , 发现用堆维护是可行的 .
把儿子复合到父亲上的操作需要可并堆 . 思路和上一道题确实差不多 .
ABC305H
这道题在青岛那时候做过 , 那时候对这道题 , 只能说是勉强理解思路 . 这次重新做 , 感觉透彻了很多.
看来我还是有进步的.
首先这道题显然是由一个外层的划分最优化和一个内层的最优化一个集合拼起来的 . 从内向外研究 .
可以自由排序时 , 这个东西或许叫国王游戏 . 尝试划一下式子
也就是一个集合内最优化的顺序是确定的 .
放到外层 , 发现任一区间的价值都是可计算的 .
外层是一个分段问题 , 段数还不确定 . 直接 dp 无法解决 , 这种划分/选物品的形式 , 联想 \(WQS\) 二分 , 发现这种划分类问题符合凸性 , 那么就用 \(WQS\) 二分来做 .
但是此时有一个问题 , 区间贡献 \(W(i,j)\) 需要 $O(n) $ 复杂度计算 , 想办法优化 . 因为要重排序 , 没有分配律 . 观察样例 , 大胆猜想 , 一个合法的 \(W(i,j)\) 的长度不会太长 , 因为 \(n\) 次函数处理相当于对 \(n\) 指数 . 精细考虑 , 只要 \(A_i\ne 1\) 就可以保证 \(len\le \log k\) . 对 \(A_i=1\) 发现它很没用 , 一定会排在最后 , 作用就是全局加 \(B_i\) , 单独处理即可 .
这道题体现出了基本的分拆问题的意识 , 每个子问题确切来说都并不算难 , 有足够的提示来联想到基本的东西 .
还有一个整体思路和精细实现的问题 , 整体考虑时不要陷在细节问题里 , 想到细节问题 , 要有基本的判断 , 确定整体思路正确下这些细节可以解决 , 然后着重串联整体思路 .
而上手写代码之前则一定要考虑精细实现 , 这很重要 , 保证了实现过程中不会被细节问题打断 , 整体思路连贯 , 比如 \(WQS\) 二分的斜率如何处理 , 同斜率如何处理等 .
P4383 林克卡特树
首先题意很神秘 , 同时下面标上了题目并不难 , 这就是所谓"诈骗题" , 实际意义是 , 经过转化过程后会显然 , 清晰很多的题目 .
于是考虑切断的每个子树一定贡献直径 , 如果直径为负就不考虑 , 也可以视作取一个点数为 \(1\) 的路径 . 抓住本质 , 子树并不重要 , 关键的是找到路径 , 最大化他们的和 . 而它们能分到不同子树的意义是 : 没有交点 .
转化后变成 : 找 \(k+1\) 条不交路径 , 最大化他们的和 .
到这里想到 dp , 于是来到了经典的 "有一维度记录已选物品数去不掉" , 这个是套路的 \(WQS\) 二分 .
到这里整体思路可以宣告完成了 . 但是 \(WQS\) 的处理 , dp 等都需要精细实现的 .
- 先考虑转化的一个特判 , \(k=0\) 时如果权值全为 \(-\) , 按照我们的转化是选一条 \(1\) 点数的路径 , 然而没有加的 \(0\) 边可以选 , 这样是不合法的 . 要输出最短边 , 其余情况就都对了 .
- 考虑树 dp , 一个子树只有状态 \(0/1\) 表示是否向父亲连边即可 , 具体更新 , 需要讨论有 \(0/1/2\) 个儿子向上连边 , 不要忘记根单独也可以作为路径 .
- \(WQS\) 二分经典问题 . 对斜率相等的处理 , 需要保证尽可能 \(cnt\) 小 , 提取答案时计算向后拓展几步 .
总体而言是一道简单黑 , 在"题目并不难" 以及刚刚做了 \(WQS\) 二分的提示下 , 还算是独立地想出来了 , 作为 "第一次做" 的流程 , 还是很顺畅的 , 在该转化时转化 , 归约到合适问题后联系到合理的算法 .
总结
其实最近总体状态还是不太好 , 总感觉在内耗啊 . 总是要刻意地屏蔽一下自己的想法 , 不受这些或外来或内源的焦虑等等的干扰 .
下午后来也是放弃刷水题了 . 去重点重做了 ABC305H , 然后潜下心研究了一道林克卡特树 . 林克卡特树是完全的 "第一次做" 几乎没有受其他因素影响 , 思考过程很纯粹 , 还是很有意义的 .
认真投入到题里去的时候 , 情绪也会平静很多 . 有时候没有定数的东西没必要太内耗 , 用具体问题移开心神 , 最好还是享受 OI 本身吧 .