可能有点胡言乱语。
本人较菜,部分题目借鉴 tiger2005 的题解。
观察到 ,那么我们可以转化我们要解决的问题:
记 。如果我们让 货物和 货物运到一起,我们会有 的收益。由于 ,所以选择尽可能多的货物同时运输是更优的。
我们将货物按照 从小到大排序,那么这样我们可以很好的根据 确定 能够匹配哪些货物。那么如果我们确定了是哪 个货物,那么匹配的货物必然是第 个和第 个,。
假设其中一对是 。
如果 ,就是有 ,显然可以推出 和 ,那么如果匹配 和 ,那么会多出 和 的贡献。那么 移动不是最优匹配中的匹配。
所以有 。
那么我们就很容易能够设计出 DP 了,记 表示处理了前 个货物的匹配的最大收益,可以得到三种转移:
显然,这个转移时容易写成 矩阵的,记 :
。
其中 ,。
考虑将所有询问从小到大排序处理,那么 和 的变化次数总计只会有 次,使用数据结构维护动态 DP 即可。
时间复杂度 。
会被 修改的所有位置没有办法传输任何有效的信息,所以能够传输的有效信息之后 位。
考虑需要传输多少个信息才能传输 ,因为 的位数不确定,所以我们需要 位才能够传输信息:得到一个长度为 的信息 ,将最后一个 记以后的零都删除之后得到 。
那么我们剩下的位就只剩 位了,刚好就是单次传输的信息长度,也就是 的长度。
发现我们难以在 次传输内传输 具体时多少。所以我们考虑实际传世的有效信息是一个 的矩阵,我们只需要在占用 个格子的情况下确定 ,然后挖掉这 个格子,剩下的格子按照顺序就是 。
考虑对于每一个不会被 修改的位置,我们确定一个 表示在循环移位的意义下向后移动 次可以刚好到达下一个不会被 修改的位置。
传输 的方式就是让前 位为 ,第 位为 。考虑上会被 修改的位置,每一个位置都会指向另一个位置,形成一个内向基环森林。而 个不会被修改的位置会形成一个大小为 的环。
由于总共只有 个节点,所以大小为 的环是唯一的,找到这个环就可以确定所有有效的位置。
发现我们占用的格子数就是 ,刚好环绕一遍整个环,总计 个。
首先考虑如何处理依次询问。
发现我们的策略必然是在叶子处有 ,非叶子有 。考虑非叶子处我们减少的具体数量是不确定的,所以我们可以先预留出来它可以减少多少次,在后面需要减少的时候挑最优的减少。
对于每一棵子树,维护可重集合 ,每一个 表示一个可以用 的代价减 操作,那么操作就是:
- 在树上合并所有的儿子的集合
- 将所有 的 都替换成 。
- 按照 从小到大删除,直到 。
- 将当前集合中权值最大的 个的 变成 。
初始化为所有叶子节点集合为 个 。
考虑将这个问题拓展到多组询问。
由于上面的处理,除了某些数会被只删掉 个之外,其余的所有块都只会被 个同时删去或者不删去。发现整个操作和 的绝对大小没有很大的关系,我们只关注 的相对大小,也就是 的值。
我们可以维护出在 的时候不会被删去,在 的时候会删去的权值之和为 。那么对于 ,最终答案为 。
仍然尝试使用使用单次询问的方法去维护,默认 ,但是由于不确定 ,所以我们统一到最后去对应贡献,但是考虑到在过程之中可能会出现有一些数要被删除的情况。但是考虑到,在一个儿子内会被删除掉,那么在后面的所有节点它都会被删除掉,所以一定会被删除。
那么我们只需要在它被修改的时候对他会影响的位置进行差分即可。
对于一个某个节点的集合内的第 大,代价是 的点,如果它的父亲贡献是 ,那么 就会在父亲处变成 ,但是实际上在 的时候它应该用 的贡献,那么它会对 的所有询问做出 的贡献
那么对于一个节点 ,权值等于 元素都会在第一个 的祖先处被卡住,所以我们考虑找到这个节点,以及 对应的那个 的儿子 ,假设 的所有节点对应 中的第 大,那么就会对 这一段加上 。
由于每一个节点都必然会有一个权值为 的点,所以我们初始将每一个点的 设为 。我们从大到小枚举 ,那么权值为 的节点数量 就是 的所有儿子当前的 之和,同时如果 的 就会增加 。
而找 可以直接使用并查集维护,时间复杂度 。
省略了很多证明,详情可见这里。
首先我们考虑 UCS 的组成结构。
对于一个字符 ,如果其在 中出现了 次,在 中出现了 次,那么显然 和 有一个公共子序列为 个 。
那么 UCS 就至少包含 个 ,如果有 ,那么 中所有 位置都会被 UCS 选择,称 为 的关键字符;同理 的情况, 中所有的 都会被 UCS 选择,称 为 的关键字符。我们成所有关键字符在对应序列中的位置为关键位置。
记 UCS 为序列 ,那么我们可以得到两个长度为 的序列 和 ,有 ,那么显然 和 中有且仅有一个是关键位置。
那么发现 UCS 的长度就是确定的,就是 。同时由于 和 的所有公共子序列都是 的公共子序列,所以 UCS 应为唯一确定的。
现在的做法就很明确了,找到唯一一个可能是 UCS 的序列 ,然后检验 是否满足 UCS 的限制。
对于第一步,为了不遗漏情况,我们使用子序列经典的贪心匹配法,维护两个指针 和 表示当前 UCS 匹配到了 和 的哪个位置。
记 之后的 中的下一个关键位置在 , 之后 中的下一个关键位置在 ,那么 的下一位必然在 和 中选择。
我们考虑如果 能够被选择需要满足什么条件:
- 存在 使得 。
- 在 中 的数量不小于 中 的数量。
如果这两个条件满足,我们就认为 可以被选择。同理可以判断 。
如果两个都不可行,显然无解;如果只有一个可行,那么只能选择这个;如果两个都可行,可以被证明,能够按照这个方法生成出来的 UCS,都能找到一个 和 的公共子序列,其不是 UCS 的子序列。
这样我们就得到了一个 UCS,现在我们要考虑检验它是否满足条件,也就是是否所有的 和 的公共子序列都是 的子序列。
考虑仍然使用子序列匹配的思想,分别记 为在 中匹配到的位置。那么我们就是希望构造出来一个序列,使得匹配到某一位时, 和 仍然能匹配,但是 不行。
首先,显然有 和 ,因为显然存在通过 和 将 中的匹配映射到 和 的方式,使得 。而 和 中又可能存在其他的匹配方式,所以只可能更小。
同时,如果 且 ,我们可以选择依次匹配 ,发现共会匹配 位但是 只能在往后匹配 位了。这样就构造出了无解的情况。
我们考虑匹配过程中 的几种情况:
情况 : 且 。我们假设下一个匹配的时 的一个关键字符 ,设 变成了 ,显然有 。假设 也匹配到了 ,那么仍然是情况 ,否则会变成情况 。
情况 : 和 值满足一个,不妨假设时 ,假设接下来要匹配的字符是 ,如果其不在 中出现,那么 的值变成 也没有区别,可以被归类为情况 ;否则有 ,考虑 会匹配到什么位置,如果匹配的是 中存在的位置,可以通过讨论得到 ,仍然是情况 ;否则有 ,归类为情况 。
情况 : 且 ,这就是让 UCS 无解的情况。
发现情况 只能从情况 导出,而在情况而中我们有 的推导,所以我们发现满足条件的 且 情况必然有 。
而这个是很好处理的。我们只需要对于每一个不是 从存在位置的 ,找到所有匹配到 位置的序列中,最小的 ,然后检验最大的 使 是否满足 。对于堆成情况是相同的。
而对于 求 ,是可以用单调栈处理的。
认为 同阶,则最终时间复杂度为 。
如果 为 ,那么 一定是 ,那么 是 ,也就是最终会形成若干条 的斜线。
但是发现由于第一行和第一列被确定了,所以可能会出现一些奇怪结构,但是考虑向下拓展一层之后,不会出现相邻的 ,再往下拓展一层之后,不会出现相邻的长度超过 的 。发现这种情况下,就会达到如下结构:
通过观察,发现我们可以维护出一个集合 ,对于所有 , 为 当且仅当 。
将询问差分成 个 的询问。这样,我们特殊处理 的部分,其余的部分可以直接 计算贡献。
总时间复杂度 。
首先考虑链的情况怎么做。我们可以选出一个独立集 ,然后将所有其余的点染成颜色 。
如果 中没有颜色为 的点,那么答案应该是多少是可以确定的,具体等于 加上删掉独立集中的点之后图剩余的连通块数。
如果询问得到的结果不等于这个值,那么就说明 中有节点的颜色为 。我们将 看作一个序列,那么我们就可以通过二分来找到 中第一个颜色为 的点,然后就可以将这个点删掉了。
这样,我们最劣通过 次询问就可以确定 内部所有点的颜色。
而对于链的情况,甚至对于任意二分图的情况,我们通过直接对二分图进行黑白染色将点集拆成两个独立集,然后分别处理。
但是很显然图不一定是二分图。
发现我们要求 是独立集的限制,一来要防止出现 内存在相邻的点对互相干扰,二来要保证 内每一个点至少和一个不在 中的点相邻。
对于第一点,我们发现,如果 中相邻的点如果颜色不相同,那么他们之间也不会互相干扰,所以如果能够将所有相邻且颜色相同的点缩成同一个点,然后再去处理,此时图中不存在相邻且颜色不同的点对,那么 有没有元素不相邻的限制了。
那么现在我们只需要关注第二点,这个是容易实现的,只需要在图中找到一个生成树然后黑白染色即可。
那么现在的问题就变成了如何将相邻且颜色相同的点缩在一起,也就是 的部分分。
考虑增量构造,依次将 加入点集,每次加入 的时候,考虑已经在点集内且与 相邻的所有点,我们将除此之外的所有点染成 ,询问的点和 保留, 不与任何相邻的点集颜色相同,那么答案也是可以提前计算的。如果询问得到的结果和预期的不一样,那么就说明 和之前的某一个点颜色相同,仍可以通过二分得到。
假设合并之后还剩 个点,那么这一部分需要的询问次数不大于 。
那么最终询问次数不大于 ,发现在 的时候是可以通过的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现