Codeforces 1800+ 乱做
- CF1328D [dif:1800]
- CF1398D [dif:1800]
- CF1438C [dif:2000]
- CF1400D [dif:1900]
- CF1366D [dif:2000]
- CF1348D [dif:1900]
- CF1370D [dif:2000]
- CF1359D [dif:2000]
- CF1359E [dif:2000]
- CF1355E [dif:2100]
- CF765F [dif:3100]
- CF1416C [dif:2000]
- CF1110E [dif:2200]
- CF1101D [dif:2000]
- CF1513D [dif:2000]
- CF1467D [dif:2200]
- CF1006F [dif:2100]
- CF1473E [dif:2400]
- CF1637E [dif:2100]
- CF1628C [dif:2300]
- CF1166E [dif:2100]
- CF1088D [dif:2000]
- CF1408F [dif:2300]
CF1328D [dif:1800]
组询问,每次给一个大小为 的环,点 的类型为 ,给每个点染色,如果相邻点类型不同则颜色必须不同,求最小使用的颜色数,输出方案,颜色编号从 开始。
答案只可能是 。讨论亿下即可。
CF1398D [dif:1800]
给你三个序列 ,分别有 个元素,每次从两个序列中挑两个没选过的元素 ,贡献为 ,可以挑无数次,问最大贡献。
贪心寄了!
反悔贪心也寄了!
考虑 DP,设 表示 序列中前 个元素, 序列中前 个元素, 序列中前 个元素的最大贡献。(先排序),显然有转移方程:
CF1438C [dif:2000]
给你一个 的矩阵,每个位置可以选择是否 ,输出最后的矩阵使得没有相邻的位置相同。
把他当作一个二分图,按照 的奇偶性讨论即可。
为什么这种题在 cf 能评 2000 ???而且还附带一堆高深算法
CF1400D [dif:1900]
给你一个长度为 的序列,寻找满足 的 对数。
枚举 的位置,然后算算两侧有多少相同的,乘法原理统计即可。
CF1366D [dif:2000]
给你 个数,对于第 个数 ,找到它的两个因子 ,使满足 。
首先,如果 ,那么一定无解,因为任何因子都是 的倍数。
然后,先说结论,设 且 ,则 是一组合法解。
考虑证明,已知 。
考虑反证法,假设 ,即 ,可以得到下式
此处 为正整数。
若 ,则
不成立。
若 ,那么 ,与已知条件不符,也不成立。
综上,得证 是一组合法的构造。
CF1348D [dif:1900]
开局有一个质量为 的细菌,然后选任意个细菌分裂,质量平分,之后每个细菌质量 ,让所有细菌质量和为 需要几步操作,输出方案。
转化一下题意:假设当前有 个细菌,和为 ,每次可以将 变为 中的任意一个数,然后让 加上 。
每次加的越多越好,所以贪心加 。但是最后一次加的数可能小于 ,但是没关系,这次操作可以放在之前 的某步操作内,然后按顺序求一遍答案即可。
CF1370D [dif:2000]
给你一个长度为 的序列,选择一个长度为 的子序列,它的贡献是 偶数位的最大值 和 奇数位的最大值 中的较小值,求这个值最小是多少。
假设贡献是偶数位的最大值,就相当于在序列中选 个不相邻的数,最大值尽可能小。
可以二分,看看能选的数有没有达到 。
奇数位同理。注意要分类讨论一下起点和终点能否选(需要给对方留)。
复杂度是 ,其中 。
CF1359D [dif:2000]
给你一个长度为 的序列 ,设 ,求 。
。
枚举最大值 的值然后求最大子段和。复杂度 。
CF1359E [dif:2000]
给你两个数 ,构造一个长度为 的严格递增序列 ,需满足 ,并且满足
序列是所有 的排列。
求构造的合法 的方案数。
设构造序列中的最小值为 ,另一个值为 ,那么要满足
因为 ,所以左半部分相当于 。也就是说要满足下面的式子:
设 ,则
也就是说 。
于是我们可以枚举最小值,然后后面只能放它的倍数,用组合数直接算一下方案数即可。
CF1355E [dif:2100]
给你四个值 ,表示有 个数,第 个数为 ,目标是让他们变成同一个数,花费 可以让某个数 ,花费 可以让某个数 ,花费 可以让一个数 一个数 。求最小花费。
。
解决这题的关键需要发现它是一个单峰函数。
设需增加 个,减少 个最优,且 ,最终数值为 。
如果 ,那么贡献为 。一个上升另一个就会下降,显然这是一个单峰函数。
否则,贡献为 ,然后你考虑吧当前的数值 加一或者减一,考虑它的变化量,发现它仍然是个单峰函数。
因此可以三分。为了防止边界出问题,一个技巧是把边界设成 ,最后一部分暴力枚举。
时间复杂度 。
CF765F [dif:3100]
给你一个长度为 的序列 , 次询问,每次询问给一个 ,求 。
。
考虑离线,用扫描线枚举右端点然后维护左端点的答案,
考虑新加一个点 。
考虑有哪些点对可能有贡献,必定是一个递增的子序列,并且长度不超过 。
对于长度 的证明,设有 且 ,如果 都能作为更新点,那么一定有 ,不然的话枚举 的时候就能把 更新,所以说这个距离每次可以缩到原来的 ,证毕。
然后查询的时候可以从右向左从大向小,用线段树维护答案,主席树维护值域上最靠右的位置。
因为主席树维护的是一个 ,所以只能查一个前缀,所以要从右向左更新答案。
然后就做完了,时间复杂度是 。
CF1416C [dif:2000]
给你一个长度为 的序列 ,异或一个数 ,使它的逆序对最少。
。
从大到小按位考虑,只考虑这一位产生的逆序对,算一下填 优还是填 优,直接贪心取。
然后把这一位是 的和这一位是 的分成两部分分治考虑下一位即可。
注意每一位要放到最后一起贪心。
时间复杂度 。
CF1110E [dif:2200]
给你两个长度为 的序列 ,每次可以这样操作:,问能不能将 变成 。
这个操作和 NOIP2021T3 可谓是完全一样啊/kx
每次操作相当于交换相邻两数的差值。
那么我们只需要比较一下差值的值域是否相同,首尾是否相同即可判断。
CF1101D [dif:2000]
给你一棵 个点的树,每个点有权值,求一个点数最多且所有点点权的 的链,输出链上点的个数。
。
发现 。
也就是说一个点的质因子最多有 个,那么我们对齐质因数分解,将 个质因子全部存下来进行 DP 即可。
设 表示在 的子树中以 为一端 为 的第 个因子能够得到的最长链, 表示 的第 个因子。
转移方程:
然后就做完了。
CF1513D [dif:2000]
对于一个序列,若有 满足 ,则连一条无向边 ,边权为 ;若有 满足 ,连一条无向边 ,边权为 。
给定一个长度为 的序列谋求连边所构成图的 MST 的边权之和,多测。
通过手模或者观察,我们可以发现,如果有一段区间满足 ,那么这一段区间内的点都可以联通在一起。
于是我们就想按照 从小到大枚举 ,然后暴力向两边扩展加边,因为一个点最多会被右边的点扩展一次,左边的点扩展一次,所以扩展次数是线性的,因为枚举的就是区间的最小值,所以直接判断是否满足 即可。
CF1467D [dif:2200]
一条线段上有 个点,机器人每次只能移动到自己相邻的点上,且不能离开这 个点。每个点都有分数,分别是 。 机器人将从任意一个点开始时,在线段上移动 次,每到一个点(包括起始点和重复路过的点),机器人的总分就会加上该点的分数。
现在,我们将对这条线段作 次单点点权修改,试求出所有的移动方案的机器人总分的总和。
看到 数据范围,一定是一个 的算法
设 表示走了 步到了 的方案数, 表示从 开始走 步的方案数。发现 ,所以只记录一个即可。设 表示 这个点一共经过了多少次。所以:
然后就做完了。
CF1006F [dif:2100]
给一个 的网格,每个位置有一个 。从 走到 ,每次只能向右或者向下,沿途要异或上 ,求有多少条路径异或和为 。
发现 只有 ,考虑折半搜索?
然后做完了。
CF1473E [dif:2400]
给你一个 个点 条带权无向边的图,无重边和自环。
我们这样规定一条路径的权值,设路径边集为 ,那么路径权值为 。
求 到第 个点的路径权值的最小值。
弱化一下这个问题,就是一条路径,让一条边权值为 ,一条边权值为 ,然后求最短路。
一种方式是设 表示到第 个点,是否已选择边不计权值,是否已选择边权值为 。
另一种方式是建分层图,不过要建两次,一种是先 后 ,另一种是先 后 。
两种方式本质上是差不多的。
然后跑 Dij 即可。复杂度为 。
CF1637E [dif:2100]
给定一个长度为 的数组 。给出如下定义:
- 定义 为 在数组 中出现的次数,
- 定义 。
同时,给定由 个数对 组成的集合 。
你需要计算出 ,要求 都出现在数组中, 且 不在集合 中。
这题 codeforces 上的标签给了暴力。
然后我们考虑存出现了 次的数的最大值。不难发现我们最多会存 个。
然后暴力枚举一下每一对,一对是否合法直接从集合 中查就好了。
然后就做完了。等等这个做法好像是错的。
如果去和最大值配对不合法,还得考虑次大值。
因此考虑用 vector
把所有次数为某个值的存下来。
然后枚举一下每个数,再枚举次数,然后从 vector
里从大到小枚举每个值判断,找到一组合法的之后直接退出。
算一下时间复杂度,外层枚举有 次查询,vector
中的枚举最多会带来 次查询。
因此复杂度为 。
看上去是过不了的,也确实过不了,TLE 79 !!!。
然后考虑一些常数上的优化,外层改为倒叙枚举,内层在查询前先判断一下这次的贡献会不会更优,如果不优直接 break
。内层查值判断的时候只找比自己大的,然后你就卡过去了。
其实如果你前两层都用来枚举次数的话,可以做到 。
CF1628C [dif:2300]
给定 的矩阵 ,求 满足 中任意一个元素等于 中与其相邻的元素的异或和 的矩阵 的异或和。
, 是偶数。
小清新构造题?
首先这是个二分图,奇偶之间不太影响。好像对答案也不影响
然后,你只需要把第一行全填 ,发现剩下的就都固定了。
CF1166E [dif:2100]
有一个长度为 () 的内容未知的序列,再给 ( )个限制,每个限制会给一个位置集合 ,需要让 中所有位置上的数的 严格大于序列里剩下的数的 ,求是否存在一个这样的序列满足所有限制。
找一下这题的切入点,考虑一下集合之间的关系。
发现如果两个集合没有相交,那么一定无解,因为不可能出现我比你大,同时你比我大的情况。
那么合法的情况一定是所有的集合都有交。其实构造方案也非常简单,这个交设为 ,其他为 就好了。不过题目没要求这个。
CF1088D [dif:2000]
交互题,你需要猜一对整数 ,每次你可以询问一组整数 ,系统会回答 和 的大小关系。询问格式是
? c d
,回答格式是! a b
。你一共有 次询问机会,保证 。
可以先有一次询问 确定 的大小关系 。记 为当前确定的部分。
然后从大到小考虑每一位,先询问一手 ,如果大小关系相同,说明 这一位均为 或者均为 ,然后可以再这一位分别放上 再询问一遍确定是 还是 。
如果大小关系不同,则可以直接确定这一位是 还是 。然后需要重新问一遍去掉 位后面这些位的 的大小关系,依次来更新 。
CF1408F [dif:2300]
题意:你需要选择 个二元组 ,每次使得 和 的值变为 。 的值为任意值,对于相同的 , 的值相同,请你找出一种可能使得对于任意函数 经过 次操作后数列中最多只有 个不同的数。
手模发现对于一个长度为 的序列是可以在 的次数内化为相同的数。
那么对于一个长度不是 的序列,找到最大的 满足 ,先对 的区间操作一次,在对 这段区间操作一次就做完了。算一下总次数是够的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!