Codeforces Round #773 (Div. 1) 题解
再一次白给……E 十分可做结果现场开都没开(其实是开了也没时间写完),D 写 甚至跑不过 bitset 暴力。。。还好是小号,否则就要掉大分了 /dk/dk
A
直接模拟即可。碰到商为 的数对就将它们暴力配对。
B
一道很容易想复杂的题,现场卡了很久最后才发现是我想复杂了……
首先如果存在一种数出现次数为奇数那显然不行。考虑如何对于剩余的情况构造出一个合法的序列,我们找出第一个 使得 ,然后在 后面插入两个 ,在两个 后面再插入两个 ,两个 后面插入两个 ,以此类推。譬如 序列为 ,那么我们就进行一次操作将序列变为 ,然后将序列的前 分划分成一个符合要求的序列 ,这样我们再对后面的序列 构造即可,这样一来序列长度减少了 ,并且剩余的序列依然满足每种数出现次数为偶数,归纳构造即可,总操作次数就是 ,刚好符合本题的限制。
C
首先对于一条形如 0 l r
的信息,我们可以确定 中的数都是 ,这个可以使用 set 维护区间删点。对于一条形如 1 l r
的信息,如果我们发现 中 的个数恰好等于区间长度减 ,那么我们可以确定区间中那唯一不是 的元素是 。那么对于剩余的元素呢?显然,我们没办法知道剩余元素的值,因此当我们询问这些位置时,答案一定是 N/A
。
这样我们就能够确定最终每个位置的状态(是 / 是 / 不确定),但是对于此题,我们还要动态地维护一个已知消息的集合并根据集合中的信息,判定每个位置的状态。这个其实也比较好办,只需要再记录一下我们知道每个位置的状态的时间戳 就行了,对于最终状态为 的位置,我们就将其时间戳设为我们将其赋为 的时间,对于最终状态为 的位置 ,我们枚举所有包含 的区间,计算出 中所有 被确定的时间与该区间的信息获得的时间的 ,设其为 ,然后令 对 取 。这样每次询问只需检验确定的时间是否 当前询问的时间即可。
D
奇奇怪怪题目, 跑不过 ……我也是无语了(
做法有很多,这里讲一种我的做法。考虑如何判断一个数组的集合 内是否存在一个与 不相交的集合。我们考虑 中的所有数组 ,我们统计 表示 ,也就是 中有多少个数组 ,满足 是 的子序列,那么 就是 中与 不交的数组个数,这个可以用容斥的思想来说明,因为 ,所有与 不交的数组恰好会对和式产生 的贡献,而所有与 相交的数组不会对和式产生贡献。
这样一来思路就比较明显了:二分答案 ,然后将所有数组按 排序,check
过程中按 降序枚举所有数组,这样所有与 权值之和 的数组是一段前缀,two pointers 维护这个前缀集合的信息即可。
现场写了个线段树二分……当然过不去(
E
一道非常普通的多项式题。
考虑设 表示离 最近的关键点离 的期望距离,那么我们不妨先假设可以取空集,算出期望后乘个 即可。
考虑如何求 ,我们设 表示前 个点中关键点的个数, 表示 是否为关键点,那么很明显我们要枚举离 最近的关键点是什么(如果有多个最近的关键点,我们不妨假设最左边的关键点离 最近),设其为 ,这样距离 小于 到 距离的关键点都不能被选,特别地,如果 在 右边,那么离 距离等于 与 的、且在 左边的关键点也不能被选。这样我们可以列出式子:
很明显可以想到拆为 左边带 项、左边带 项、右边带 项、右边带 项处理,以左边带 项为例,记 ,再设 ,那么这一部分对 的贡献就是 。而求解 是经典问题,可以使用分治 NTT 解决。这样复杂度是 。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现