2024集训D3总结

集训D3总结

模拟赛

T1 (反悔贪心/模拟费用流)

题意

\(n\) 个物品 , 有价值 \(\{w_1,w_2,w_3\}\) , 有容量分别为 \(V_1,V_2,V_3\) 的背包 1 , 2 , 3 ( \(V_1+V_2+V_3=n\)) . 把一个物品放到一个背包中贡献的对应价值 , 最大化价值和 .

题解

可以显然地想到一个费用流模型 , 左边 \(n\) 个物品 , 分别向右边三个背包连流量 \(1\) , 价值分别为 \(w_1,w_2,w_3\) 的边 . 背包分别向汇点

连流量 \(V_1,V_2,V_3\) 的边 . 二分图跑 MCMF 有 \(O(n\sqrt n)\) 的复杂度 , 可以过掉大部分点 .

不过发现费用流模型不是很复杂 , 可以考虑模拟网络流 , 也可以说是引导出反悔贪心的一种思路 .

发现涉及了三个背包的讨论 , 考虑简化一下问题 , 为了减少退流 , 可以先把所有流量超额流到 \(V_1\) , 发现此时可以把 \(V_1\) 理解成汇点 , 原来的价值为 \(w_2-w_1\)\(w_3-w_1\) 的增广路就可以作为新的边 . 从实际意义上说 , 就是先把所有东西超额扔进 \(V_1\) , 然后再用 \(w_2-w_1\) 和$ w_3-w_1$ 的差价补回 \(V_2\)\(V_3\) .

这样就把问题转化成了一个只有两个背包的问题 . 发现增广情况数很简单 . 对于每一个背包 :

  • 如果还没有流满 , 直接找出还没有装进来的点 发出的 , 到当前背包价值最大的 , 直接流入 .
  • 否则从把自己的一个退出去给另一个背包 , 选这样操作的代价 (减少的价值) 最小的一个 . 然后再从外面取一个最大的 .

正确性也是显然的 , 当两个背包都没有装满时 , 一个点肯定是进入其价值较大的一个背包 , 因此退一个物品放进另一个背包不会让总价值更优 , 因此没满时不用走多余的增广路径 , 满了也只需要走一次 .

用堆维护 , 每次直接找出对应的增广路取最大一条 , 一直到 \(V_1\)\(V_2\) 都装满为止 .

关于这个先全选一个背包的转化是如何想到的 :

肯定要往问题的简化去想 , 于是考虑两种背包怎么做 , 发现没有必要上一般意义上的反悔贪心 , 全选一个背包然后补差价 , 贪心选收益最大的就好 .

这转化到网络流上 , 相当于把所有 \(n\) 流量给了 \(V_1\) , 而正边上只能过 \(V_1\) 的流量 , 相当于反边凭空生成了 \(n-V_1\) 流 , 相当于变化了网络流的图形 , 把源点转化到其中一个背包上 !

这启发我们对三个点的情况也做一次类似的变换 , 把右点减少到两个 , 大大减少了增广路的讨论情况 .

其实按照三个右点似乎也可以讨论出全部的增广 , 但是远远不如从简单的情况中找一点更好的性质再简化一次好 .

总结

70/100 少特判 .

很基础的模拟费用流 , 分辨出算法不难 , 后面暴力讨论一下增广 , 可以很套路地做出来 .

以找到更优性质 , 梳理思路 , 设计较优的实现为目的 , 进一步观察题目很重要 .

还有要小心特判 , 不仅要跑大样例 , 检查时还得 .


T2 (博弈论/分块)

题意

给一个序列 , 在一次游戏中 , A先手 , 每次只可以选择一种操作 :

  • 把当前位置 \(-1\) , 如果为 \(0\) 不能操作 .
  • 向右走 \([ 1,k]\) 步 , 不可以超过终点 .

给出序列 \(a_i\) , \(q\) 次回答如下询问 :

  • 1 x y d\(x\)\(y\) 区间加 \(d\) .
  • 2 x y 求对于以 \(x\) 为起点 , \(y\) 为终点 , 使用区间 \((x,y)\) 的的一局游戏 , 询问 A 赢还是 B 赢 .

题解

首先只考虑向右走的操作 , 显然当且仅当一个点 , 右边 \(k\) 个位置全必胜 , 这个点必败 .

再考虑 \(-1\) 操作有什么影响 , 发现如果先手向右走必败 , 可以进行一次 \(-1\) 操作拖延时间 , 把必败状态传给对手 . 然而 , 对手也可以用同样的操作把必败状态传回来 . 说明这个操作的影响一定与奇偶性有关 !

假设当前位必败 , 如果 \(a_i\)\(0\) , 那么当然必败 , 如果是 \(1\), 可以把必败态给对手 , 对手拿到的是 \(0\) , 是必败的 , 依次类推 , 如果 \(a_i\) 是奇数 , 是必胜态 . 只有在向右走 \(k\) 个都是必胜态且 \(a_i\) 为奇数时必败 .

换句话说 , \(a_i\) 为奇数强行钦定了当前位必胜 .

到这里性质已经观察到差不多了 . 接下来把每一位按奇偶性视作 \(0/1\) 来考虑 .

回到最原先不考虑 \(a_i\) 的情况 , 相当于都是 \(0\) , 此时必胜态 (设为 \(1\)) 有显然的 \(k+1\) 长度循环节, 即

\[ 1\cdots^{k个}\cdots 1 \ 0 \ 1\cdots^{k个}\cdots 1 \ 0 \ \]

发现 \(a_i\)\(1\) 出现在必胜位置上没有意义 , 但是如果原来的必败位置是 \(1\) , 他的前一个位置变成了新的必败位置 , 相当于循环节整体前移了 \(1\) .

因此 , 这些关键点构成了一个循环减一的子序列 , 现在想要维护从任意的起始值出发这样的序列的长度 , 这样可以确认在起始点位置循环节的位置 , 从而确认起始点是否必胜 .

维护操作 , 发现区间加加偶数没有影响 , 加奇数相当于区间取反 .

放在线段树上单点信息 \(O(k)\) 没有均摊 , 所以分块 . 对每一块维护只考虑 \(0/1\) 的点 , 后面的循环节中必败位置是 \(i\pmod k\) , 会让这个位置循环左移多少位 . 每次整块取反 , 相当于切换考虑 \(0\) 和考虑 \(1\) .

复杂度 $O(q\sqrt n) $ , \(2e5\) , \(2s\) ,非常卡常 .

总结

40/100 . std不开O2都过不去 , 卡常啊.

在场上这道题还是做慢了 .

分析博弈的流程非常重要 , 博弈乍一看没有确定的方向 , 于是具体地研究最基本的 , 每种情况向其他情况转移中最优的决策 , 然后引导向 \(SG\) 函数 , 找性质或者套皮dp/数据结构等等方向 .

这道题 , 分析到 \(1\) 让循环节左移这一步时 , 加上区间查询 , 修改的操作 , 发现已经接近一个数据结构题 , 于是转而研究如何用

信息描述 , 维护这个过程 . 如果能够比较优美地用状态描述博弈过程 , 或者有比较优美的转移方式 , 就向 dp 转化 . 如果转化成了类似 \(Nim\)游戏的若干个公平组合游戏的结合 , 那就考虑推导或者打表搜 \(SG\) 函数 .


T3 (构造)

题意

构造一个 \(n\times m\) 矩阵 , 使符合 \(1\times w\)\(w\times 1\) 的 , 且内部单调的子矩阵恰好有 \(k\) 个 .

题解

属于比较智慧的构造题 , 做法很多 .

观察得到给出的上界与实际上界相差很多 , 而且两维限制不好构造 , 可以想办法把列的限制去除 , 于是先考虑 \(n=1\) .

  • 发现想要任意构造一个数 , 相当于若干个连续段拼接 , 贪心地放置连续段 , 用组合数算贡献即可 .

然后考虑 \(n\ne 1\) , 为了不考虑竖直方向的贡献 , 想办法竖直方向贡献确定化 . 方法不一 :

  • 保证一行极大一行极小交替 , 保证只有相邻两行贡献 .
  • 保证行与行间单调 , 保证竖直方向全部贡献 .

总结

0/0 场上跑路了 .

因为 T2 做慢了 , 而且感觉构造不一定可做 , 于是几乎没有分配时间 , 事实上还算可做 .

最有趣的就是想办法把列的问题去掉 , 让行与行间 "独立" , 然后针对行构造 .

构造的时候 , 能打表搜索一定要做 , 有很重要的启发作用 !


训练情况

LOJ560

题意

给出一个长为 \(n\) , 由 +* 组成的序列和常数 \(k\) . 对于一个这样的序列 , 定义其权值为 :

  • 初始权值为 0 , 从左到右遍历序列
  • 如果当前位是 + 就把权值\(+1\)
  • 如果当前位是 * 就把权值 \(\times 2\)
  • \(2^k\) 取模 .

求原序列的一个子序列 , 最大化其权值 , 以二进制形式输出 .

\(n,k\le 10^6\)

题解

神秘好题 , 对练难找切入角度的题有意义 .

题目给出了保证 + 不相邻的部分分 , 没有别的好想法 , 就从这里入手 .

发现这相当于每个 * 后面是下一个二进制位 , 如果后面有+就可以在这一位填一个 \(1\) . 而对 \(2^k\) 取模相当于从中取出 \(k\) 位 , 那么在能填满 \(k\) 位的情况下 , 一定是优先让高位上设置 \(1\) .

因此 , 对于每一个 1 , 如果其位置 \(\ge k\) , 即可以放在最高位上 , 就放在第 \(k\) 位 , 同时 \(k-1\to k\) 更新限制 , 继续最大化后 \(k-1\) 位 .

而如果位置 \(<k\) , 无法填在当前最高位 , 就尽可能调高位 , 即第 \(i\) 位 . 然后 $i-1 \to k $ , 向后最大化 .

而对于每一位上不只一个 + 也就是每一位可以是 \(>1\) 的数时 , 发现会出现进位的问题 , 我们原来的贪心失效了 . 此时应该先尝试找性质 , 转化 , 尝试把更复杂的问题转移到我们已经解决的较简单的问题上 .

  • 每一位相互独立 , 没有必要把两位合到同一位上 .

    也就是说 , 对于 +++++*+++++ 不用考虑不选 * , 而同时选左右的 + 的情况 . 这是显然的 , 因为无论这些 + 是否分成两位 , 其能贡献的权值都是一个 \([1,x]\) 形式的连续区间 . 而分成两位显然范围更大 , 覆盖了更多情况 .

    这一点是重要的 , 它保证了虽然有进位 , 但是分成每一位考虑仍然是正确的 .

  • \(0\) 与其他权值有本质区别 , 但其他权值之间只有进位的区别 .

    发现贪心其实在贪两件事情 :

    • 填满 \(k\)
    • 填满的前提下 , 优先向较高位放\(1\) .

    这样来想 , 如果所有位都有权值 , 那么可以连接出一个较优的全 \(1\) 序列 , 但是如果某一位是 \(0\) , 就只能依靠进位来补 \(1\) .

结合这两条性质 (或者说思考过程 ) , 可以先尽量简化问题 : 让每一有权值位尽可能进位 , 同时保证权值不变为 \(0\) . 问题变成了接近刚才问题的形式 : 每一位只可能取 \(0,1,2\) .

区别出现在 \(2\) 上 , 就讨论一下 \(2\) :

  • 如果位置 \(\ge k\) , 那么贡献 \(2\) 是不优的 , 因为在能填满的情况下 , 填 \(2\) 只可能导致因为结尾多了一个 \(0\) 而变得更劣. 直接贡献一个 \(1\) 到最高位 .
  • 否则 , 为了最大化总权值 , 把 \(1\) 填在较高位上 , 应该填 \(2\) , 同时 \(i+1 \to k\) , 表示仍然尝试让后面的 \(2\) 进位填上第 \(i\) 位 .

因为有了进位这件事 , \(1\) 填不满的情况也要变成 \(i+1\to k\) , 表示仍然尝试让后面进位 , 和当前位的 \(1\) 合并 , 贡献到更高位 .

实现上先对原来扫一遍 , 完成进位 . 然后模拟即可 . 最后不要忘了对答案处理进位 .

总结

部分分一部分比较好想 , 算是基本铺垫了这道题用什么方式看待 .

后面的转移看似神秘 , 其实还是有迹可循的 , 这道题中主要是向着部分分做法转化 , 找到了简化问题的方法 .

CF335F (占坑 , 来不及写了)

总结

找性质

这几天的题都有找性质的特性 , 总结一下一个整体体会 . (把前两天的零碎文字粘一起) .

很多题的关键部分 , 笼统地说是找性质 , 转移 . 具体解构一下思考一道题 :

  • 转移不是盲目尝试 , 目的很重要

    • 已经解决简单子问题 , 向着它转化
    • 找到当前问题难点 , 为了解决它拆解原问题 .

    举例 : 如果一道题存在若干个条件限制 , 而且一一枚举各种情况不好计算 , 就可以尝试用容斥放款条件统一计算 , 比如 D1 做的ABC241Ex .

    然而 , 如果想到容斥后 , 发现放宽条件后仍然不好计算 , 甚至回到了和原来相同的子问题 , 那说明 (当前想到的) 容斥不合理 , 比如同是 D1 做的 ABC221H .

  • 如何找性质

    • 积极尝试 , 手动模拟 , 倒推可能性质等等 .
    • 尤其关注 子问题 和 **特殊情况 ** . 在 LOJ 560 中 , 几乎所有性质都是在向子问题靠拢的过程中引导出来的 .
  • 去神秘化

    是比较新的一种体会 . 拿到一道题 , 如果不能及时缕清思路 , 始终用"不确定" 的思路做题 , 就算做出来了也不一定清晰 .

    当然在很多难以切入的题( 比如今天的模拟赛 T2 和昨天 THUPC G题 , 都是博弈) 中 , 肯定是带着大量的模糊印象开始分析 , 但是一定要始终明确自己对那些思路 , 结论 , 性质是确定的 , 并且以这些思维为基础 .

  • 整体 , 局部

    时刻记着从整体和局部的视角都要尝试分析 .

  • 连续 , 跳跃

    大多数时候 , 为了防止让自己的思路变神秘 , 应该保证思维连贯性 .

    但是如果当前思路不对 , 一定会在某处陷入停滞 , 在这种情况下更容易导致"神秘化" , 这时应该跳跃出来 , 从全局或者某些之前没关注的局部问题出发 , 重新审视整道题 .

这些方法仍然是概括性的 . 想来想去还是应该统一总结一下 , 在具体问题方面就不再重复 .

应该把这些内容养成思维习惯 , 做题时把自己总结的东西想一下 , 或许可以让练习过程收获更多....

而具体问题整理时应该保持原来 , 整理找思路的方法 , 同时整理具体技巧和思维方式 .

posted @ 2024-12-16 15:36  youlv  阅读(17)  评论(0编辑  收藏  举报