Duel 记录
· CF204C Little Elephant and Furik and Rubik
容易求出总的匹配对数,即 ,要求期望只要求 .
考虑每对匹配的字符对 的贡献.
因为一对匹配的字符在字符串中的相对位置不变,所以它的贡献就是能同时延伸到的字符串个数.
不妨设第一个字符的位置为 ,第二个字符的位置为 ,那么贡献就是 .
由于字符集大小 很小,可以枚举 的字符和第一个字符的位置,动态维护第二个字符的位置的前缀和与后缀和.
- CF2B The least round way
最小化后缀 个数也就是最小化路径上数的 和 的次数.
考虑分别记录 和 的最小次数,较小值即为后缀 的最小个数.
需要特判 存在的情况.
- CF1254B1 Send Boxes to Alice (Easy Version)
只要考虑非零的 为同一质因数的情况.
最小距离就是每段与中位数的距离.
+ CF251C Number Transformation
注意到 很小,这意味着可以将数轴划分为长度为 的段,不同段相同位置的行为是相同的.
并且可以发现在同一个段中操作最终总是到 的倍数.
于是可以在段内 dp 跳过前面的段,最后一段 bfs 即可.
· CF1930C Lexicographically Largest
每个 能贡献的最大数就是 . 考虑证明如果两个数贡献的数相同,一定有一个能减 而其它数不受影响.
对于每一个位置 ,其要减的数可以不超过 ,那么必然可以以一定的顺序通过先操作前面的数得到要减的个数.
+ CF1036C Classy Numbers
令 表示 中含义不超过 个非零数字的数的个数.
设 ,那么 .
其中 .
即为所求.
· CF360B Levko and Array
二分答案 .
令 表示 不改变,前面的数使得答案成立最少需要改变多少次.
转移考虑距离 最近的不改变的位置 .
那么 间的所有数都可以改变,使答案成立当且仅当 .
+ CF1887B Time Travel
枚举时刻 ,我们只要知道有多少点可以在时刻 第一次被访问到并把它加到访问到的点的集合里.
因为一条边只会贡献一个点,所以可以尝试枚举边加点.
如果边中两点都没被访问到,那么就会被重复考虑,所以每当新点被访问,我们再加入点对应的边即可.
这样所有边都只会被考虑到一次,使用 std::unordered_map
复杂度是 的.
· CF1995C Squaring
直接从前往后贪心模拟就好了.
因为如果 ,那么 ,所以只要记录平方的次数,再在相邻原项模拟.
· CF474C Captain Marmot
判断 个点是否构成正方形. 计算 ,然后判断有没有 对点的距离平方是 或者 .
· CF578C Weakness and Poorness
每个区间 的 poorness 为 两段直线,先减后增.
于是 weakness 为 就是凸的,用三分检验最大子段和即可.
几何做法再说.
+ CF1918D Blocking Elements
二分答案 .
然后考虑 dp,令 表示前 个数 在满足区间和最值约束下 分隔点和的最值.
转移就是部分和小于等于 的最小 ,可以用 map 维护.
+ CF1969D Shop Game
因为 Bob 总是会选 最大的 个,钦定 Bob 选择的最小 .
对于 Bob 选择的 个数,选择 的 最小的 个,可以大根堆动态维护.
对于其他 的数,使用前缀和计算最大收益就可以了.
· CF1184E1 Daleks' Invasion (easy)
删除第一条边求 MST,当第一条边的两个端点合并至同一联通块时计算答案.
+ CF2036G Library of Magic
如果返回的答案不为 ,二分即可找到答案.
不过如果 ,并且询问的区间同时包含这三个数就会返回 .
怎么样避免区间同时包含这三个数呢?注意到如果 ,那么肯定存在一个数 的最高位比其他两个数低.
进一步地,如果 ,那么 .
于是如果询问区间长度等于左端点,必然不会出现包含要找的数且返回 的情况.
我们可以先询问全局异或和,这样就只要找到两个数了.
然后每次询问 ,如果询问答案 不为 可以二分找到一个数 ,如果 可以通过消除 的影响再二分找到第二个数.
询问次数是 ,注意到 ,最大询问次数 也就是 ,直接这样问是会 WA 的.
再怎么减少询问次数呢,考虑从大到小询问 . 那样询问的最大次数就变成了 ,足够通过本题.
还有另一种思考方式,因为 的时候可以二分,所以只要考虑相等的情形,其中两个较大的数 最高位一定相同.
于是可以从高到低查找它们的最高位在哪里. 找到之后,二分就可以了.
然后发现 的时候也可以通过这种做法找到两个较大数的最高位,所以最后的实现和第一种思考方式居然是一模一样的!
+ CF431D Random Task
因为 与 二进制 的个数相同,所以答案是递增的,且每次最多加一,那么必然有解.
考虑二分,计算 即 的数中恰有 个 的个数.
令 ,将 拆成 ,那么 .
因为 ,所以可以直接递推求组合数(当然也可以用 long double
或者用 __int128 在模大质数意义下求组合数).
- CF551B ZgukistringZ
转化为 .
因为字符集大小 ,直接 枚举即可.
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具