Duel 记录

CP Duels

· CF204C Little Elephant and Furik and Rubik

容易求出总的匹配对数,即 i=1ni2,要求期望只要求 f(x,y).

考虑每对匹配的字符对 f(x,y) 的贡献.

因为一对匹配的字符在字符串中的相对位置不变,所以它的贡献就是能同时延伸到的字符串个数.

不妨设第一个字符的位置为 i,第二个字符的位置为 j>i,那么贡献就是 i×(nj+1).

由于字符集大小 Σ 很小,可以枚举 Σ 的字符和第一个字符的位置,动态维护第二个字符的位置的前缀和与后缀和.

- CF2B The least round way

最小化后缀 0 个数也就是最小化路径上数的 25 的次数.

考虑分别记录 25 的最小次数,较小值即为后缀 0 的最小个数.

需要特判 0 存在的情况.

- CF1254B1 Send Boxes to Alice (Easy Version)

只要考虑非零的 ai 为同一质因数的情况.

最小距离就是每段与中位数的距离.

+ CF251C Number Transformation

注意到 lcmi=215 i=360360 很小,这意味着可以将数轴划分为长度为 lcm 的段,不同段相同位置的行为是相同的.

并且可以发现在同一个段中操作最终总是到 lcm 的倍数.

于是可以在段内 dp 跳过前面的段,最后一段 bfs 即可.

· CF1930C Lexicographically Largest

每个 ai 能贡献的最大数就是 ai+i. 考虑证明如果两个数贡献的数相同,一定有一个能减 1 而其它数不受影响.

对于每一个位置 i,其要减的数可以不超过 i,那么必然可以以一定的顺序通过先操作前面的数得到要减的个数.

+ CF1036C Classy Numbers

f(x,d) 表示 0x 中含义不超过 d 个非零数字的数的个数.

B=lgx,那么 f(x,d)=f(10B1,d)+(x10B1)f(10B1,d1)+f(xmod10B,d1).

其中 f(10B1,d)=i=0d(Bi)9i.

f(r,3)f(l1,3) 即为所求.

· CF360B Levko and Array

二分答案 x.

dpi 表示 ai 不改变,前面的数使得答案成立最少需要改变多少次.

转移考虑距离 i 最近的不改变的位置 j.

那么 ij 间的所有数都可以改变,使答案成立当且仅当 |aiaj|(ij)x.

+ CF1887B Time Travel

枚举时刻 i,我们只要知道有多少点可以在时刻 i 第一次被访问到并把它加到访问到的点的集合里.

因为一条边只会贡献一个点,所以可以尝试枚举边加点.

如果边中两点都没被访问到,那么就会被重复考虑,所以每当新点被访问,我们再加入点对应的边即可.

这样所有边都只会被考虑到一次,使用 std::unordered_map 复杂度是 O(k+mi) 的.

· CF1995C Squaring

直接从前往后贪心模拟就好了.

因为如果 x<y,那么 x2<y2,所以只要记录平方的次数,再在相邻原项模拟.

· CF474C Captain Marmot

判断 4 个点是否构成正方形. 计算 d=(x,y)(xy)2,然后判断有没有 6 对点的距离平方是 d8 或者 d4.

· CF578C Weakness and Poorness

每个区间 [l,r]poornessP(x)=|i=lrai(rl+1)x| 两段直线,先减后增.

于是 weaknessW(x)=maxP(x) 就是凸的,用三分检验最大子段和即可.

几何做法再说.

+ CF1918D Blocking Elements

二分答案 x.

然后考虑 dp,令 fi 表示前 i 个数 在满足区间和最值约束下 分隔点和的最值.

转移就是部分和小于等于 x 的最小 f,可以用 map 维护.

+ CF1969D Shop Game

因为 Bob 总是会选 bi 最大的 k 个,钦定 Bob 选择的最小 bi.

对于 Bob 选择的 k 个数,选择 biai 最小的 k 个,可以大根堆动态维护.

对于其他 <bi 的数,使用前缀和计算最大收益就可以了.

· CF1184E1 Daleks' Invasion (easy)

删除第一条边求 MST,当第一条边的两个端点合并至同一联通块时计算答案.

+ CF2036G Library of Magic

如果返回的答案不为 0,二分即可找到答案.

不过如果 ab=c,并且询问的区间同时包含这三个数就会返回 0.

怎么样避免区间同时包含这三个数呢?注意到如果 ab=c,那么肯定存在一个数 1 的最高位比其他两个数低.

进一步地,如果 ab=c,那么 2min(a,b,c)<max(a,b,c).

于是如果询问区间长度等于左端点,必然不会出现包含要找的数且返回 0 的情况.

我们可以先询问全局异或和,这样就只要找到两个数了.

然后每次询问 [2i,2i+1),如果询问答案 x 不为 0 可以二分找到一个数 y,如果 xy 可以通过消除 y 的影响再二分找到第二个数.

询问次数是 3log2x,注意到 log2101860,最大询问次数 150 也就是 2.5log2N,直接这样问是会 WA 的.

再怎么减少询问次数呢,考虑从大到小询问 [2i,2i+1). 那样询问的最大次数就变成了 log2N+log2x,足够通过本题.

还有另一种思考方式,因为 abc 的时候可以二分,所以只要考虑相等的情形,其中两个较大的数 1 最高位一定相同.

于是可以从高到低查找它们的最高位在哪里. 找到之后,二分就可以了.

然后发现 abc 的时候也可以通过这种做法找到两个较大数的最高位,所以最后的实现和第一种思考方式居然是一模一样的!

+ CF431D Random Task

因为 n2n 二进制 1 的个数相同,所以答案是递增的,且每次最多加一,那么必然有解.

考虑二分,计算 f(n,k)0n 的数中恰有 k1 的个数.

B=log2n,将 [0,n] 拆成 [0,2B)[2B,2B+(n2B)],那么 f(n,k)=(Bk)+f(n2B,k1).

因为 (6432)1.8×1018,所以可以直接递推求组合数(当然也可以用 long double 或者用 __int128 在模大质数意义下求组合数).

- CF551B ZgukistringZ

转化为 maxk=0n(mini=1Σ(AikBi)/Ci+k).

因为字符集大小 Σ=26,直接 O(nΣ) 枚举即可.

posted @   Lcyanstars  阅读(31)  评论(1编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示