CF VP 记录
刷了蛮久 CF 了,一直忘记写记录,现在想起来就写一下。
CF 1697 (2022.7.28)
A,B
无意义水题。
C
把操作等价于 的移动,只能在 中向左移,在 中向右移。
把 , 提出来之后看对应的两个 之间有没有不能跨过得即可。
D
操作 1 的 26 已经提示了每种字母只能用一次操作 1 。
那么一个很 naive 的想法就是对于每种字母求出他们最后的位置,每次扩展的时候暴力询问,但这样是 27000 次的。
然后又发现这东西可以二分,那么就做完了。
E (赛后)
dp 还是太菜了 /kk
根据题意,两个点可以同色当且仅当他们互为最近点对。
那么我们可以把图拆成数个联通块,连通块中两两曼哈顿距离相等,连通块中的点要么同色要么全部异色,这求出来是 的。
然后就可以 dp 了,令 表示第 个联通块大小。
设 表示前 个联通块,使用了 种颜色的方案数,那么分类转移一下,全部同色和全部不同色。
最后答案即为 , 为联通块个数。
F
不会
CF 1711 (2022.8.12)
**A,B,C **
无意义水题。
D
稍微转换一下就是一个三角形区间覆盖问题,值域小的话我想到一个线段树做法,但是这1e9。
从被覆盖的地方考虑,找到所有大于 的点,那么三角形顶点应该在这些点向上的三角形的面积交中。
因为面积交的斜率只有1或-1,最后的面积交肯定是一个三角形,找两边截距取max即可。
这个离散化和求面积交没见过,很妙!
E
数位dp ,根本不会。
对每一位分类讨论一下,容易发现规律, ,转换一下同样适用。
那么我们是需要保证一位满足大于即可,对于三种情况都记录一下就可以数位dp了。
还是练的不够多\kk。
CF 1706 (2022.8.13)
A,B
无意义水题。
C
容易发现 为奇数时候只有一种情况,为偶数是一定是形如.x.x..x.x.x.或.x..x.x.x.x的情况,(x表示凉爽的大楼)。
预处理一样前后缀揉起来即可。
D1
枚举最小值即可。
D2
写了一个恶臭的 做法。
从最开始考虑,那么想让极差最小就需要把最大的往下除,因为最大值不变的话最小值只可能更小。
那么这个可以用一个优先队列维护,是 的,但是在D1跑得飞快。
手玩一下发现每次枚举除数的话商会有大量重复,应该枚举商,但是直接枚举商也不行。
考虑根号分治,除数小于 的时候枚举除数,反之枚举商。
(有一只 或一只根号的更优做法,wssb)
E(赛后)
一开始以为要冲一个可持久化并查集,其实并不用((
将序号转化为权值,跑最小生成树,那么要求的就是 的最小生成树上的最大边。
这个可以kruskal重构树+(*支持区间查询的数据结构)实现。
CF 1647 (2022.8.16)
A,B,C
无意义水题。
D
恶臭分讨题,细节有点多挂了两发。
令 为 中 的个数,容易发现 肯定不行, 肯定可以。
剩下 和 。
先看一下其他质因子个数,设其为 ,若 则肯定可以。
那么剩下的情况只剩下4种,讨论一下即可(太麻烦不想写了)。
E
感觉非常可做,但是并不会。
因为保证了每次会有新的数字加进来,说明不会出现内部的无限调换,那么我们就可以通过最大的数和每次加进来的数字算出总共弄了几轮。
那么我们就可以算出每个数最后到了哪里,这个可以通过很多方法实现,比如并查集和倍增。
接下来贪心,对于每个点,找到所有最后能到达它的位置,那么这个点最后的权值应该属于最前面位置。
因为如果这些位置中不可能有大于这个点的权值,因此为了字典序最小这样贪心。
剩下的点从前往后找到最小的合法值填进去即可。
CF 1701 (2022.8.22)
这场不知道为什么,每一题都挂了两发/jk 。
A,B
无意义水题。
C
忘了 set
不能去重,寄了一发。
先让每个人都做自己擅长的工作,然后每次贪心将最大的扔给最小的。
写这么麻烦,wssb。
D
每个下标对应的数都是一个连续区间,把这些区间求出来,然后再按右端点为第一关键字,左端点为第二关键字排序。
贪心,从左往右扫每个区间,找到最小的数填进去,这个可以树状数组套二分,时间复杂度 。
好像所有人都是一只 的,wssb。
E(赛后)
妈的,每次 dp 都不会。
容易发现只有三种情况:从左删,从右删,和先从右删再从左删。
那么从左边和右边分别 dp ,最后揉起来求最小值即可。
F
E 和 F 都2500就离谱,早知道先看一眼 F 了。但好像确实比 E 难。
对每个标记了的点考虑他后面 个位置的点的个数,设为 ,答案即为 。
容易发现每次修改就是将 的 值进行修改,我们直接维护即可。
由于 ,我们可以比较方便地维护。
在维护 值的同时,维护 的和以及区间内点的个数。
需要注意的是,对于这个点本身的加减比较麻烦,我们对此单独处理,新加入一个单点修改的操作。
非常考验基础能力,线段树好题。
CF 1695 (2022.8.23)
A,B
无意义水题。
C
对-1和1分别dp一遍,跑最大值,跑出来两者都大于等于路径长度的一半即可。
D1
首先,除了 以外,其他情况都至少选中一个点。
那么不妨枚举这个点并以之为根,向下dfs。
不难发现,当某个节点有 个儿子的时候,至少有 个儿子中需要有点被选择。
那么我们就可以在dfs的过程中记录子树中被选择点的总数,以及有多少个儿子中有点被选择。
单次时间复杂度 ,总时间复杂度 。
D2(赛后)
我们发现一个性质:度数大于二的点必不会被选择。
这很好证明,贪心地想,因为选它不如选它儿子优。
向外推广,最优解必定有一种情况使得度数大于二的点不会被选择。
而我们在D1的瓶颈在于不知道每个点是否会被选择。
又因为是否为根节点其实是等价的,因此随便找一个度数大于二的点直接跑D1中的dfs即可。
时间复杂度 。
还有其他做法,不再一一赘述,但是我赛时想换根没有调出来,贪心直径也假掉了。
E(赛后)
阴间构造题。
具体就是构造出一个 的矩形, 这个很好通过两种构造得到。
我们将每个骨牌中的数用有向边连接起来,形成一个无向图。
可以将这个无向图拆成数个联通块,每个联通块中都应该有偶数条边,奇数条边就说明不可能。
我们先来证明一定有两种可行的构造情况,因为一条边连接的数中一定有超过一个相同的点,那么一定可以在一种构造方式中,通过旋转操作得到另一个。
然后构造,这个通过得到欧拉序来实现,具体证明看这里。
CF 1691 (2022.8.26)
妈的,和弱智一样调半天,最后来不及打。
A,B
无意义水题。
C
记得特判全0
D
一个很自然的想法就是枚举最大值。
把最大值左边能延伸到的最大值,右边能延伸到的最大值求出来,只要有一边能大于0即无解。
于是我大到小枚举,用set维护的同时用两个st表来计算极值,调了40min,小丑竟是我自己。
for(int i=1;i+(1<<j)-1<=n;++j)
???????????????????? 。
E(赛后)
在我的努力之下,成功没有打完。
首先把颜色打在点上,如果有点同时又两种颜色,那么这点上的所有线段都是联通的。
这个可以直接离散化+线段树,或者其他奇奇怪怪的方法。
那么把特殊点求出来之后,把线段用覆盖的特殊点表示,问题就转变成求连续线段的个数。
这个也可以另开一个线段树求,但是其实以左端点排序之后 扫一遍就好了,很方便。
时间复杂度 。
调了一个小时,线段树 push_down 没清空 tag ???????????????????? 。
F(赛后)
先思考一下暴力怎么做。
直接dp,容斥一下不难发现,以某个点为lca的点集合个数就是所有集合减去 这 个点都在一个子树内的情况。
即:
暴力枚举根可以做到 。
一般要优化这种dp有两种方法。第一种是直接找性质,找到优秀的性质来排除多余的根。第二种就是直接换根。
然而这道题并没有什么性质,然后这个柿子长得也十分换根,于是我们考虑换根。
其实挺朴实无华的,但是我刷题经验不够,推了114514年,懒得打式子了。
这里记一下小技巧,换根dp的式子中,最好将x的式子分开,比如含x的都有含v的表示,别再套个x,不然换根的时候容易死在先后顺序上。
CF1677
不小心开成了div.1,但是神说没事,那么就来打一下,果然我是捞蛋。
A
傻逼题,指我是傻逼, 能过!!1
B
找规律吧,首先每一列的数都是固定的,那么每一列有没有1记录一下就好了。
然后如果有一行全是0,那么相隔 个数之后这一行的下一行也全是0,也对 取膜记录一下就好了。
记得对最后一行特殊记录。
C(赛后)
不难想到直接对这个颜色连边,每个点的度数都为2,因此最后形成的图一定是由数个环组成的。
一个含明显的贪心就是大小间隔着放,那么把环分奇偶讨论一下,那么偶环的值就是 。
然后看奇环,一定有两个连续的数是大大或小小,把这两个数当成一个就和偶环一样了。
然后这样推广一下就可以算出公式了。
D(赛后)
看到1e6就是 了,那么我们来大力找一下性质。
首先观察到,如果 ,那么 这个位置一定会被前面比它大的数交换下去,也就等价于把 数组整体左移再-1。
另外还有一个性质,一个合法的 数组和 序列一一对应,这个不是很会证明,但是看着就很对!!!
最后问题就转化为了原来的 序列有多少种可能。
那么我们先判断一下无解的情况,然后开始数数,分成四种。
- ,那么对于每一个 都有可能取到 ,乘上 。
(接下来都默认 )
-
,也就是原来的取值可以在 ,乘上 。
-
,那么取啥都没事,乘上 。
-
,就只有一种,不乘。
然后就做完了。
CF1673
什么数数场/jk。
A,B,C
无意义水题。
D
首先不难发现, 的公差一定是 的公差的倍数,不是的话就一定没有解,此外如果 中有 中没有的数值也无解。
然后再观察一下什么时候有无限解,不难发现就是 的某一边界被 包含了,那么 就可以向那个方向无限延伸。
两种情况特判完了我们再来看普通的,首先 肯定是包含 中所有元素的,而且不可能向两边再多一个 的公差的距离,如果我们确定了一个 的合法公差设为 , 的公差设为 ,那么答案就是 。
最后我们枚举 的所有因子,找到与 的最小公倍数不小与 的即可。
E(赛后)
又是数数啊,好啊,很好啊。
直接算看着八大行,那就直接枚举区间算贡献,看着是挺多的,但是超过20的肯定不行,所以就是20n的。
那么接下来算贡献,这个是一个很丑很长的组合数,但是直接算奇偶还是可以 的,奇数的话就异或上去。
说着挺简单的,打着好像也还行,就是特判有点烦。
F(赛后)
F2400,E2500,F比E简单,什么神奇构造题,srds但这F真的比E难想啊。
首先我们可以发现,走回路最后的 肯定是0,否则多次转圈会给出不同的值。
那么就可以想到同一行和同一列的道路长度应该是一样的,那么总共只有 条路了!!!
然后我们就可以构造最基础的道路了,把行和列分开考虑,那么把两个维度压起来,给每个点设置一个权值,边权就是相邻两个点异或起来,每次查询的时候把初始位置和 异或起来就可以找到最后的点了。
但是这样跑不过去!!1
考虑优化,一个很直接的方法就是那格雷码优化点权,这样边权就小很多,但还是过不了!!!
然后我们通过大力观察发现,长度大的边出现的比较少,可是我们用普通的压缩办法时,长度大的行的边权小于长度小的列的边权,十分不合理,应该把边权按照从小到大压起来,具体就是偶数位维护行,奇数位维护列。
所以为什么这题比E分低啊。
CF 1708
很有意思的一场比赛!!!
A,B
简单,但是比平时的难一点。
C
不难发现到最后的值一定是0,如果不是0的话就是全部都可以取到。
考虑贪心,从后往前取,比他打的加一,一直加到原来的值位置,不难证明这是正确的。
D
赛时手玩了一下,一开始以为有效的轮数不会很多,交了一发寄了,然后仔细看了一下这个可以被卡掉,又猜了一手0的个数肯定迅速增多,把0压在一起写,过了,现在胡一个证明。
设不为0的个数为 ,那么每次至少会减去 ,那么总次数就是 ,每次操作与 同阶,那么最后就是 ,其中 与值域同阶,而且这个东西根本跑不满。
E(赛后)
由于边权两两不同,不难证明最小生成树唯一,那么我们可以先把最小生成树上的边求出来。
接着观察给出的程序,就是普通的遍历一棵树,但每次都先走边权小的边。
手玩一下样例一我们可以发现,当以1为根节点时,4这条边是最小生成树上的横向边。
由此推广,不难证明当非最小生成树上的边为横向边时,以此节点为根无法得出正确答案。
那么不妨枚举这些边,设边的两端分别为 ,则两点间的点都不行,也就是说两点的子树都可行。
至于实现的话有两种方法,一种直接打不行的标记,另一种直接打行的标记。
显然后一种要好实现,直接树上差分。
CF 1712
A,B,C
naive
D
大力观察可以发现两个点的距离要么就是他们中间的点最小值,要么就是剩下的点的最小值的两倍。
然后考虑直接做,发现不太可做,那么就二分转化为判定性问题。
check 的时候先把小于 的数全部变成最大,接着看剩下的数,如过有连续的大于x的就行,没有的话再操作,简单判一下即可。
E1(赛后)
考虑容斥一下,变为找 。
不难发现只有 为 或 的时候成立。
前者不难处理,但是后面的我想了半天怎么容斥你告诉我打个表发现就两种可能?
E2(赛后)
测的数据增多了,暴力跑不过去了。
还是和E1一样的思路,对于每个询问,我们发现 2k 的情况很好求,那么只剩下 k 的情况。
考虑离线下来,根据值域乱搞。
具体的,我们从大到小枚举每个i,每个 i 会对其所有倍数有贡献,直接加即可。
查询的时候直接求区间和即可,那么上树状数组。
至于为什么从大到小,从小到大的话 l-1 之前的贡献是消不掉的,从大到小就没有这种问题了。
F
补 *3200 也太看得起我了吧。
CF 1719
评分都偏低,但是很不合我胃口。
A,B,C
简单的题目,但 A 放博弈论真的合适吗。
D
看到除二向上取整,果断转化为对连续两个数的代价为1的操作。
先看 D1 ,不难发现可以直接 dp,复杂度 ,其中 是值域大小。
再看 D2 ,其实我们在 D1 中就能发现,如果有多个数的异或和为 0,那么这段区间的操作个数即为 次。
那么显然我们要尽可能多地划分区间,考虑贪心地从左往右取,能合并就合并,因为一个数和前面/后面合并贡献都是等价的,不如和前面合并更优。
用 map 记录一下异或和,扫一遍即可。
E
是不是国人的思维方式有所不同,*1800 和 *1900 的 D 是蓝题, *2000 的 E 却是绿题。
一个贪心思路:把最大的数用数列中最大的项填起来,顺次向下。
因为其他同奇偶项之和小于这个项,因此必须用他来填入。
由于同一个字母不能填入相邻两个项中,因此不难证明如果最大数减了一项之后仍然是最大值即无解。
好像确实更简单一点(((
F
一个经典结论,对于每一个 ,环的长度为 。
不难发现当 不是 的因子的时候,随便选都是一样的,答案为 。
当 为 的因子的时候,暴力跑即可,每次单点修改对每个因子只会影响一个环的答案。
但是这样子时空都跑不过去啊,想一下优化。
我们发现如果两个环为包含关系,那么环长小的环一定更优,因为大环的平均值是由小环之和决定的,其中一定有大于等于平均值的小环。
于是总的时间复杂度为 。
CF 1754
久违的阳间场。
A,B,C
不难。
D
将所有的 a 从小往大合成上去。
不难发现 x! 能被整除的充要条件就是没有小于 x 的 a。
E
设总的 0 的个数为 , 为前 个为 0 时的期望步数,不难发现初始 。
令 ,容易得到。
化简一下就可以递推了。
F
有一个性质:每张床最多被移动一次。
那么我们可以将问题抽象为将相邻两个格子同时变为空格的最小代价,预处理出把每个格子变为空格的最小代价,然后枚举即可。
枚举的话可以将图建出来跑多源最短路(?,建图的话就是将其能到的位置连对应边,然后建一个超级源点和每个空格连起来。
至于为什么这样子建图不会矛盾,那是因为其实建出来的图是奇偶分开的,不必担心重复问题。
时间复杂度 。
CF 1735
A,B,C
无意义水题。
D
对每张牌预处理出他所能组成的三元组个数。
然后最终的答案就是 ,不难证明这样不会数漏。
E
做法好像挺多。
- 贪心
不妨令 ,那么我们将所有的点都放到 的右边去。
我们 枚举一下 ,然后每次 地判断即可,具体的就是每次取最大值观察一下。
- 二分图匹配
思路是相同的,只是判断的时候可以使用二分图连边匹配,直接跑最大匹配看一下是否能匹配完全,
值得一提的是,这种网络流模型有一些有趣的性质,可以将时间复杂度优化至 。
F
摸。
CF 1746
A,B,C
无意义水题。
D
不难发现,对于任意一个节点,我们肯定要将他开始的路径平均分配至每个儿子。
如果全部都能整除,那么直接一个 dfs 解决,可惜不能。
但是我们发现每个儿子最多多分配一条,那么我们可以在向下 dfs 的同时多维护加入路径+1的最大值。
将所有儿子的最大值排个序,取前面的即可,不要忘记维护自己本身加入+1的最大值。
E1
很有意思的一道交互。
看上去可以直接二分,但一个很大的问题就在于如何 check 是否为真。
这玩意直接二分根本做不了,总是可以构造出同时符合两种(真/假)的情况,所以二分不行。
我们要构造出一种矛盾的情况来确定真假,考虑三分。
询问第一部分两次,再询问第二部分一次,必能排除其中一个部分,证明可以手玩。
E2
*3200 就离谱,根本补不来。
CF 1667
A
一个性质是加了之后肯定后面全是加,减同理,枚举中转点即可。
B
不难列出 dp 式子,转化下形式之后可以使用线段树优化。
C
很有意思的构造题,构造方式多种多样,这里讲一下证明方法。
假设现在已经填入了 k 个皇后,那么剩下一个长度为 n-k 的区域,都需要用对角线来填满。
因此有 ,可以得到 k 的下界。
CF 1603
A
对于每个数判一下能否为前缀积即可。
B
分类讨论即可。
对于 x>y
,输出 x+y
对于 y>x
,输出 (y/x*x+y)/2
C
一个结论:从右往左平均地分配时唯一且最优的。
这样我们就直接得到了一个 的做法,考虑优化它。
考虑 dp ,令 为到了第 个数,最后一个数为 。
那么可以每次从前一维的倍数转移过来,但这也是 的。
这个时候就可以掏出数论分块的 trick 了,每层的状态只有 级别,转移同理。
时间复杂度 。
不会数论分块,被薄沙拉。
D
还有数论分块,tnnd。
不难得到 ,因此当 的时候不难构造出形如 的区间,因此答案必为 。
接下来考虑 ,令 为题目所求的式子,可以暴力DP:
硬做的话时间复杂度是 ,有点吓人。
考虑到一个瓶颈在于求 ,优化它,有:
令 ,得到:
结合数论分块可以在 的时间复杂度内求出,可以通过 的预处理来 求。
那么现在的时间复杂度为 ,已经很接近了。
注意到一个很明显的四边形不等式优化的形式,证明略,可以使用分治法。
那么最终总时间复杂度为 ,可以通过。
CF 1641
A
从小到大匹配再减一减。
B
有意思的构造,首先每个数数量必须为偶数,否则不行。
将每两个相同的数中间的数在第二个数后面复制一份,这样每次都会少两个数,最劣时空复杂度为 。
C
每次数据结构都不会\kk 。
注意到一个 1 区间只有当他没被 0 区间覆盖的长度为 1 时这个点才能被确定。
但是直接维护每个 1 区间并不好做,需要离线或者大数据结构。
考虑直接维护 0 区间,对于每个询问,找到他前面的 0 区间和后面的 0 区间,如果有 1 区间的左右端点分别在这两个区间中就说明肯定生病了,反之亦然。
使用线段树/并查集维护。
D
真神仙题。
做法一
使用 bitset
优化暴力,对权值开 bitset
,匹配时直接或起来即可。
注意到空间很大,可以通过根号分治优化,时间复杂度大概在 。
做法二
这个容斥是真的 NB。
判断两个集合是否重合的一个方法:枚举两个集合的子集,长度为奇数的子集相同就加一,为偶数的子集相同就减一,最终若有相等元素,则最终值一定为 1。
证明:令 为交集大小,则我们所求值为 ,由二项式定理可以推导得到。
这个方法看似时间复杂度很劣,但是在这道题中有奇用,我们可以用他来判断若干集合中于一个集合有相同元素的集合个数。
具体的,我们把这区间中的子集全部求出来,使用哈希表/Trie等数据结构记录个数,然后做上面的东西即可,最终得到的答案即为有相同元素的集合个数,可以在 的时间复杂度内得出。
本题中,最开始我们将所有集合按 排序,找到最前面的一个 r,和相应的 l,然后我们将 r 右移,此时贪心地想,l 必须向左移,具体将 l 左移时删去他的子集,如果此时与 r 相交集合减少,则说明 l 和 r 无交集,更新答案。
由于 l 和 r 单调,最终时间复杂度为 。
E
多项式爬。
CF 1528
A
傻逼 DP
B
傻逼数数,指我是傻逼。
C
考虑一个朴素的贪心,我们从 A 树 dfs 向下取,如果可以取就取,不能取就把 dfs 序区间更大的删去。
问题就转化为如何快速判断是否区间相交,可以使用线段树/set实现。
时间复杂度 。
D
这种最短路的变种好像很常考。
不难发现到达一个点越早越好,那么这是符合最短路的性质的,那么我们考虑最短路。
困难点在于如何转移,其实只要每次算出当前连的边,转移完更新一下所有点即可。
有几个小细节:边数过多 dijistra 不要用堆优化,更新时要更新两遍。
E
痛恨一切数数。
CF 1508
A
哈哈,A 打了半个小时!!!
考虑到每个字符串要么 0 大于一半要么 1 大于一半,那么肯定有两个大于一半的数是相同的。
那么把这两个数取出来,把多余的另一个字符填上即可。
B
不难发现最终的形式只有可能是 1 到 n 的排列进行区间翻转得到的结果。
那么可以发现对于后往前第 i 位,最多能形成 种排列,再进一步想,如果这一位只和后一位翻转,那么能形成 种,和后两位翻转,形成 种,那么直接从前往后推即可。
写得有点乱,细节比较麻烦。
C
性质:我们构造的边中只有一条会有权值,其余全为 0 。
证明:只有一条边就全部赋给这条边,大于一条边的话假如弄出一个生成树,把树上有权值的边的权值给不在生成树上的边显然更优。
那么我们对边数进行讨论:
- 稠密图:直接暴力枚举补边,跑 Kruskal,这个时候点数顶多在 700 左右,能过。
- 稀疏图:这个时候补图一定有环,把联通块求出来,用给的边跑 MST 即可。
稠密图的联通块个数:复习一下。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具