F. Earnest Matrix Complement
简要题意
给定 的矩阵,包含 或 的整数,定义 表示第 行 数字 的个数。
要求将 替换为 的整数,最大化:
题解
引理:每一行替换的数字都一样。
考虑固定 行和 行,那这一行填一个数字的贡献是固定的,选择贡献最大的那个数字,用调整法调整一下。
考虑简单的 DP,设 表示前 行,第 行填 的最大贡献,这里的最大贡献指填 带来的贡献,不考虑原矩阵自带的贡献。并设 为这一行 的个数,于是:
我们发现当某数字在第 行均不存在时, 都是 ,此时转移为:
此时,转移形如,先对整体做区间加法(后者),再对整体做区间取 (前者)。
并且,两行的颜色总数量是 的,我们可以暴力更新所有出现过的颜色的状态。以及,找到最大的 (对于出现过的颜色暴力判断,没出现过的颜色直接查询全局最大值)。
我们用线段树维护这个过程,现在看看怎么同时维护区间加,区间 的标记的。
用 矩阵表示这个过程:
于是我们维护一个矩阵下传的 tag 即可。事实上线段树本质在模拟线性代数,我们一直在维护一些线性映射,只是简化了矩阵乘法的过程。
再简化一下这个式子,我们发现每次都是先全局区间加,并且立刻跟上整体区间 ,于是两个转移矩阵可以合并:
tag的合并为(设 为父节点的下传 tag):
于是,标记下传便是:加法直接相加,最大值加上加法标记和父节点最大值比较取最大。而更新状态便是对 和 取最大值。
参考代码
G. Naive String Splits
简要题意
判断两个字符串 能匹配字符串 当且仅当:能将 划分为若干个子串,每一个子串不是 就是 。
给定串 和 ,对于 的每个分割点判断 能否匹配串 。
题解
若 有共同循环节,情况会变容易,即存在字符串 :,若分割点恰好分割在 末尾,原问题变为求 是否存在非负整数解。 是 有几个 。可以做扩展欧几里得,也可以暴力枚举 ,枚举总数是 是调和求和。
考虑没有公共循环节的情况,我们断言,此时对 的划分方案是唯一的(感性理解一下)。如何得到这个方案,我们设 的划分为 且 ,简单的想法是不断匹配 ,不能匹配再匹配 ,这是错误的,比如数据 。
或者,不断匹配 ,最后匹配 ,不能通过这个数据 。
两种情况的失败有共同点: 总是 的前缀,贪心匹配 会导致占用 的部分前缀;贪心匹配 时当 末尾有部分 的部分时,会导致 失配。
我们从贪心匹配 出发,既然占用了 的前缀那就补回去,设 ,若 均失配时,向前回撤 个单位再匹配 , 若还是不能配对,那可以断言这组分割是不能配对的。这里要注意的是:撤回操作时要看看之前的配对中是否至少配对了 个 ,比如 数据,在匹配到第 个字符时,由于前面的 是 配对的,不能撤回。
在这组策略下,每个 的配对都是不相交的,所以单组询问配对次数是 ,对所有询问求和是调和求和,总复杂度 。
处理配对使用哈希或 函数。
参考代码
I1. Affectionate Arrays (Easy Version)
简要题意
给定序列 ,满足 ,构造序列 满足:
- 是 的子序列。
- 。
- 的最大子段不大于 的最大子段和。
- 满足上述要求, 尽可能小。
求出最小的 。
题解
设 。
设 的最大子段和为 , 则必有 (因为 和相等),那么我们可以构造出 。
我们将最大子段和转化为前缀和的加减问题,可以发现 等价于 的所有前缀和都在区间 上,令前缀和为 :
- 充分性:首先有 ,若存在位置 ,那么区间 有更大的子段和;若存在位置 ,则区间 有更大子段和。
- 必要性:可以发现对于 ,且 。
考虑 DP,设 为目前考虑了 ,前缀和为 至少需要多填几个数,初始时 ,答案为 ,有转移:
以 为例,我们可以发现该转移实际上是进行一个长度为 的滑动窗口,先将 的值依次复制到 上,再对其余所有位置取全局最小值加一。
根据此观察,我们能发现 的最大值最小值差最多为 ,且最小值的位置构成区间,我们归纳的证明这个结论:
初始时该区间为 符合条件。假设上一次的区间为 ,对于 ,若 和区间 有交集,则全局最小值不变,该区间变为 , 为交集区间;否则没有交集,则最小值加一,区间变为 。对于 是同理的。
于是我们维护这个区间和当前最小值即可。
参考代码
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性