Loading

国庆 CF 做题记录

CF2002F2

考虑 F1,当 \(n = m\) 时,我们默认 \(l \ge f\)。此时我们可以发现一个比较正确的策略:先从 \((0,0)\) 跳到满足 \(p\) 是质数的 \((p,0)\) 处,然后再跳到满足 \(q\) 是小于 \(p\) 的质数的 \((p,q)\) 处,然后再暴力 BFS。不会证明,可以达标找出这样的结论。

\(n > m\) 时,注意到 F1 算法错误的原因在于可能存在一个数 \(x\in [p + 1, n]\) 满足 \(\gcd(q, x) > 1\)。延用算法,不难想到应该找到最大的 \(\le \min(m, p - 1)\) 的满足 \(\forall x\in [p + 1, n], \ \gcd(q, x) = 1\) 的数字 \(q\)。我们假定质数密度为 \(\log\) 级别,\([p + 1, n]\) 中共有 \(O(\log n)\) 个数,每个数携带的质因子个数为 \(O(\log n)\),所以我们只需要暴力跳共 \(O(\log ^ 2n)\) 次就能找到合法的 \(q\)。对于每个可能的 \(q\),判定时需要枚举其所有质因子,所以这部分复杂度是 \(O(\log ^2 n\log m)\) 的。

剩下的沿用 F1 的方法,暴力 BFS 即可。

  • 启示:弱化数据(F1),沿用弱化版的方法并进行一些改动;质数密度复杂度分析,不会假。

CF2006E

题目的信息看起来很难转化,考虑直接暴力维护每个点到其他点的距离最大值 \(d_{1...n}\),每次取出最小值即可。

考虑维护直径中心,可能是一个点或一条边。每次加入一个点时,直径中心至多移动半条边,并且远离直径中心的部分的 \(d\) 都会 \(+1\)。可以将树拍平到 DFS 序上,然后做不定根子树 \(+1\) 即可。

对于度数 \(=3\) 的点,一定不能是答案,可以直接将其 \(d\) 值赋为 \(+\infty\)

  • 启示:有些题目信息可能不需要转化,可以考虑直接维护所有信息;每加入一个点,直径中心移动至多半条边。

CF2004G

我们容易发现,\(t_1\) 长度 \(>1\) 时一定不优(\(t_3,t_5\) 等同理),证明:\((10a+b)c = 10ac + bc > a(c + 1) = ac + a\)

可以 dp:设 \(f[i, j]\) 表示考虑了前 \(i\) 个位置,当前每一位要写入 \(j\) 次的答案。注意到如果要改变 \(j\) 的值,我们无法保证要写入的内容是否为空,所以新加一维:\(f[i, 0]\) 表示下一位一定改变 \(j\) 的值。

这个可以用 \(10\times 10\) 的矩阵描述,矩阵乘法即可。但是会超时,注意到对于所有长度为 \(k\) 的子段求答案有个 trick:考虑分块,块长为 \(k\),这样只需要求每个块的矩阵的前后缀乘积即可。

  • 启示:观察性质,简化条件;定长分块。

CF2003F

这题和巧克力那题几乎一样。\(b\) 互不相等的限制难搞,考虑随机化,对 \(1...n\) 每个数随机分成 \(m\) 个组,只需要保证每个组各选出一个数即可。

每个组各选一个数,该限制可以状压保证,剩下的就是树状数组优化 LIS 了。令随机化次数 \(T = 500\),错误率 \(p = \left(1 - \dfrac {m!}{m^m} \right)^{500}\)。当 \(m = 5\) 时,\(p ≈ 3.142153\times 10^{-9}\),时间复杂度为 \(O(T2^mn\log n)\),足以通过。

启示:随机化处理很难搞的信息。

CF2001E2

连续取出两个数,对于根来说,提上来的数可以分类讨论:同一侧或是两侧分别提一个数。

如果我们使用 DP,这意味着需要考虑一个堆被取出两个数、取出一个数、以及不取数的方案数。题目时间限制明显为立方,不超过此复杂度即可。

  • \(d[i, j]\) 为深度为 \(i\) 的根不超过 \(j\) 的合法的堆的个数,这个容易计算。

  • \(f[i, j, x]\) 为深度为 \(i\) 的根为 \(j\),次大值为 \(x\),且取出一个数后依然合法的堆的个数
    钦定取出堆顶后提上来是左儿子,转移:\(f[i, j, x] = d[i - 1, \min(x - 1, j - x)] \sum\limits_y f[i - 1, x, y]\),对 \(f[i, j, \_]\) 做一遍前缀和即可。

  • \(g[i, j, x]\) 为深度为 \(i\) 的根为 \(j\),且次大值为 \(x\),连续取出两个数后依然合法的堆的个数。
    钦定两次提上来的数都来自左儿子子树,枚举左儿子为 \(x\),左儿子子树次大值为 \(y\),转移:\(g[i, j, x] \gets \sum\limits_{y = 1} g[i - 1, x, y] \cdot d[i - 1, \min(x - 1, j - x)]\)。优化:将 \(y\) 拆为 \(\le j - x\)\(\ge j - x + 1\) 两部分,分别可以前缀和优化。
    钦定第一次提上来的来自左儿子,第二次提上来的来自右儿子,枚举他们分别为 \(x,y\),转移:\(g[i, j, x] \gets \sum\limits_{y = 0} ^ {\min(x - 1, j - x)} \left(\sum\limits_{l = 0} ^ y f[i - 1, x, l]\right) \cdot \left(\sum\limits_{l = 0} ^ y f[i - 1, y, l] \right)\),对 \(f\) 的前缀和数组,做乘积的前缀和优化即可。

  • 启示:设计 DP 时需要从原问题的初始点入手,然后一路推出所有可能需要设计的状态。

CF1993F2

边界改方向一定是需要转化的,不然做不了。题目对应条件等价于横坐标为 \(2w\) 的倍数,纵坐标为 \(2h\) 的倍数。

枚举经历了若干个轮回,最后走了前 \(i\) 步。设 \(a_i,b_i\) 分别为走了前 \(i\) 步后的横坐标和纵坐标,设 \(x\) 为经历的轮回数,有方程

\[\begin{cases} a_nx + a_i \equiv 0 \pmod {2w} \\ b_nx + b_i \equiv 0 \pmod {2h} \end{cases}\]

移项得

\[\begin{cases} a_nx\equiv -a_i \pmod {2w} \\ b_nx\equiv -b_i \pmod {2h} \end{cases}\]

很明显需要 exCRT,对于方程 \(ax \equiv b \pmod m\),等价于 \(ax + pm = b\)。用 exgcd 解不定方程,可以得到任意一个合法的 \(x_0\) 以及周期 \(q\)

那么该同余方程相当于:\(x\equiv x_0 \pmod q\),这样就转化为了一般形式,直接 exCRT 即可。

posted @ 2024-10-04 11:57  Lgx_Q  阅读(3)  评论(0编辑  收藏  举报