记录近期训练遇到的 10 道值得记录的 Codeforces 题,平均难度约 2000+。
CF1870E
题意
对长度为 n(n≤5000)n(n\le 5000)n(n≤5000) 的数组 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(n≤106) 的数组 a(1≤ai≤n)a(1\le a_i\le n)a(1≤ai≤n),求不存在 x∈ax\in ax∈a 使得 x∣aix|a_ix∣ai 且 x∣ajx|a_jx∣aj 且 i<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(n≤4000) 且仅包含 [1,k](k≤4000)[1,k](k\le 4000)[1,k](k≤4000) 的序列,求它们 costcostcost 的和。
做法
- 计算 cost 的策略是从左到右扫描长度为 kkk 的窗口,将每次最先出现的 k 排列计入答案
- 考虑统计所有序列中每个位置上被计入答案的 k 排列个数。以 iii 位置结尾的 k 排列被计入答案的前提是以 [i−k+1,i−1][i-k+1,i-1][i−k+1,i−1] 结尾的子段都没有被计入答案
- 定义 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=ki−k⋅k!−∑j=i−k+1i−1dpj⋅

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

被折叠的 条评论
为什么被折叠?



