Codeforces 刷题笔记(2024.4)

本文解析了五道Codeforces题目,涉及动态规划、MEX的计算、质因数分解的应用、线性基问题、威尔逊定理以及数论分块技巧,展示了在解决不同难度的算法问题时的策略和优化方法。

记录近期训练遇到的 10 道值得记录的 Codeforces 题,平均难度约 2000+。


CF1870E

题意

对长度为 n(n≤5000)n(n\le 5000)n(n5000) 的数组 a(ai∈[0,n])a(a_i\in [0,n])a(ai[0,n]),选择若干不重合的子段分别计算 MEX 再异或起来,求该异或值的最大值。

做法
  • 很容易想到朴素的 dp 做法:令 dp(i,j)dp(i,j)dp(i,j) 表示考虑前 iii 个元素能否得到异或值 jjj,对于每个状态从前缀所有元素转移,时间复杂度 O(n3)O(n^3)O(n3)
  • 考虑到 MEX 相同的段中只有极小子段用于转移有意义,可以发现极小子段只有 O(n)O(n)O(n),于是只要预处理出有意义的极小子段再 O(n2)O(n^2)O(n2) 转移即可

CF1884D

题意

给定长度为 n(n≤106)n(n\le 10^6)n(n106) 的数组 a(1≤ai≤n)a(1\le a_i\le n)a(1ain),求不存在 x∈ax\in axa 使得 x∣aix|a_ixaix∣ajx|a_jxaji<ji<ji<j(i,j)(i,j)(i,j) 对数。

做法
  • 计算 gcd(ai,aj)=xgcd(a_i,a_j)=xgcd(ai,aj)=x(i,j)(i,j)(i,j) 对数 dp(x)dp(x)dp(x)
  • 对于所有没有因子在 aaa 中的数 u,计算 ∑udp(u)\sum_u dp(u)udp(u),即为答案

CF1861E

题意

定义序列 aaa 最多包含 costacost_acosta 个不重叠的子段,满足每个子段都是 [1,k][1,k][1,k] 的排列。对于所有长度为 n(n≤4000)n(n\le 4000)n(n4000) 且仅包含 [1,k](k≤4000)[1,k](k\le 4000)[1,k](k4000) 的序列,求它们 costcostcost 的和。

做法
  • 计算 cost 的策略是从左到右扫描长度为 kkk 的窗口,将每次最先出现的 k 排列计入答案
  • 考虑统计所有序列中每个位置上被计入答案的 k 排列个数。以 iii 位置结尾的 k 排列被计入答案的前提是以 [i−k+1,i−1][i-k+1,i-1][ik+1,i1] 结尾的子段都没有被计入答案
  • 定义 dpidp_idpi 表示在 i 位置被计入答案的 k 排列个数,则按照上述策略,dpi=ki−k⋅k!−∑j=i−k+1i−1dpj⋅(i−j)!dp_i=k^{i-k}\cdot k!-\sum_{j=i-k+1}^{i-1} dp_j\cdot (i-j)!dpi=kikk!j=ik+1i1dpj
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值