首页 > 其他分享 >国庆 CF 做题记录

国庆 CF 做题记录

时间:2024-10-04 12:27:07浏览次数:8  
标签:log limits 记录 pmod sum CF 国庆 即可 equiv

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 即可。

标签:log,limits,记录,pmod,sum,CF,国庆,即可,equiv
From: https://www.cnblogs.com/Sktn0089/p/18446472

相关文章

  • 【题解】「CF765F」Souvenirs
    https://www.luogu.com.cn/problem/CF765F首先有一个比较navie的\(O(n\sqrtm\logn)\)的做法(add和del的时候,用两个multiset维护一下。有一个bitset的做法来优化用multiset查询前驱后继的做法:https://www.luogu.com.cn/article/zcmco6hd首先考虑离线下来,将询问挂......
  • tmux指令记录
    tmux除了终端复用外,还有个作用是当远程ssh之后,如果要临时退出,可以通过tmux保持当前会话进程。特别是需要较长时间的下载或者cmake的时候可用。以下内容来源于AI:tmux是一个终端复用器,它允许用户在一个终端窗口中创建多个会话,并且每个会话可以包含多个窗口和窗格(pane)。这使得你可......
  • CF154C题解
    传送门:https://codeforces.com/problemset/problem/154/C求出无向图中,满足所有出边都相连或出边直接连接点对的点对数。很显然可以暴力枚举点对一对对去check,时间复杂度\(O(n^2+m)\)。#include<bits/stdc++.h>usingnamespacestd;inlineintread(){charc;boo......
  • 2024.10.[2, 3]训练记录
    10.2上午noip模拟比赛是8:00开始的,人是8:40起床的。T1猜了结论,秒了。结论是,一开始按照倒序排,连续是\(1\)的段\(reverse\)成正序。这样逆序对最多。感觉做法太简单\(O(n\logn)\)肯定不放。于是想了\(O(n)\)做法。最开始有\(\dfrac{n*(n-1)}{2}\)个逆序对,按段考虑......
  • CF2018E2 Solution
    CF2018E2Solution先考虑E1的做法。首先我们如果钦定一组\(k\)条线段的话,容易求出最大组数。简单来讲就是将所有端点按照右端点排序,这样只需要考虑一个偏序,然后扫描,将区间\([l_i,r_i]\)加一,当发现某个点的值为\(k\)时,就说明分成了一组方案。此时我们一定清空,然后记录当......
  • 题解:CF2009G1 Yunli's Subarray Queries (easy version)
    题目要求\(a_i=a_{i-1}+1\),设\(b_i=a_i-i\),如果\(b_i=b_j\),那么\(i\)和\(j\)就在正确的相对位置上。这应该很好理解吧,\(a\)是一个公差为\(1\)的等差数列,下标也是一个公差为\(1\)的等差数列,对应位置相减就相等了。我们在输入\(a_i\)的时候减去\(i\),然后用滑动窗口......
  • 国庆快乐!附ssh实战
     小伙伴们,有一段时间没更新了,目前在中科院软件所实习,在这里我祝大家国庆快乐! 今天这一期带来ssh命令的实战教程,ssh在工作当中遇到的非常多,因为总是需要登服务器,而且玩法也有不少,这是我常用的几个玩法。1、Windows直接连接虚拟机启动的Linux。sshuser@IPV42、从Linux反向......
  • CF1246F
    考虑怎么较容易地表示\(\operatorname{dist}(u,v)\)。注意到对于每个点\(v\),\(\leq1\)步能到\(v\)的点形成一段区间,记为\([l_v,r_v]\)。考虑枚举终点\(x\)和最短路长度\(d\),动态维护所有\(\operatorname{dist}(u,v)\leqd\)的所有点\(u\),这些\(u\)显然也是一段区间......
  • CF1051F题解
    传送门:https://codeforces.com/problemset/problem/1051/F注意到\(m-n\le20\),求一个连通图中任意两点间最短路,我们不难想到将问题转换到树上。先求出树的任意一颗生成树,此时倍增或者树刨能轻松算出仅含树边的最小路径。而对于非树边,从边的角度显然很难做到,我们不妨从点的角度思......
  • 「杂题乱刷2」CF827B
    题目链接CF827B解题思路假设树以\(1\)为根,考虑先将\(k\)个深度为\(1\)的节点,然后我们就可以将剩余的节点挂在目前的叶子节点上,但是如果一个叶子节点挂了\(2\)个叶子节点的话,那么这样叶子节点数目你一定不能使叶子节点减少,因此一个叶子节点最多只能往下挂一个节点,因此你......