CF 做题记录
CF1784C
弱化版就是将序列进行排序,设 的排名为 ,如果 ,就将 删除(后面的数排名也相应减一),否则将 加入到答案中。
现在我们考虑每次加一个数,对答案的影响:我们加入一个数 ,会让大于 的数的排名加 ,这时候,如果在加入 前存在一个数 ,它的排名 ,那么这个数就要删掉。
因此,我们要找到最近的大于 且满足上述条件的 ,并把它删除。之所以找最近的,是因为删除 后会让大于 的排名减一,抵消了加入 的1排名变化。
因此我们考虑开一个权值线段树,维护 : 的个数; :只考虑 这些数的答案(操作次数); : 中,权值减去排名的最小值。
当 时,就说明有数需要删除,通过线段树二分删除即可。
CF1784D
考虑构造一个序列 ,获奖的人是 ,与 比赛的是 ,统计这种序列的方案数是多少。
我们默认 都是 的右儿子。
显然, 的子树内一定都是 的数。
对于 的左子树,它的根一定是 ,而且它的排列方式有 。
由于 会选走 个数(也就是相当于内定了),因此左子树所选的数的方案数为 。()
因此 的左子树总的方案数就有:
所以,对于构造的序列,它的总方案数:
由于 是 的左儿子还是又儿子都没有影响,因此方案数还要乘上一个 。
我们考虑怎么一般化。
我们设 表示 放在 时的方案数。
显然, 是从 再乘上那一坨系数转移过来的,这个可以用前缀和优化。
最后, 就是 获奖的方案数。
CF513F2
显然,只有 才有解,那个万能棋自然转化为少的那一种。
由于是同时移动,那么答案应该是移动时间最长的那个棋子,因此我们考虑二分答案 。
预处理出每个点之间的距离。对于一个红色棋子 ,如果它走到 这个位置的时间 ,那么我们就从 向 连出一条流量为 的边;如果是蓝色棋子就反过来连即可。
连完边后,我们就跑一遍最大流,如果得到的答案是 ,那么说明这个时间是可行的。
由于点数为 ,边数为 ,那么时间复杂度是 ,但由于这个图类似于二分图,实际过程中不可能跑满,因此可过。
CF1372E
首先,有一个贪心的想法,就是我们应该将 尽可能填在同一列上。
我们考虑用区间 :设 表示只考虑分段是 的子集的最优答案。
现在考虑如何合并出 :我们枚举中间点 ,那么有转移为 。其中 表示分段包含 这个位置,且分段是 的子集的个数。
我们可以用高维前缀和预处理出 。
时间复杂度为 。
CF1740F
对于合并后的集合,如果长度不足 的,我们用空集补到长度为 ,这与原问题等价。并将元集从大到小进行排序。
对于两个元集 ,如果有 ,显然我们可以将 中的一个元素移到 中。
因此,对于两个集合 ,如果有 ,那么 也是一个合法的构造。
我们可以设计一个状态: 表示考虑到前 位,长度和为 ,上一个选的是 ,那么转移就是显而易见的了。
但这样似乎是 ,显然过不了。
但我们可以发现,第 位选择的长度不会超过 ,这是调和的。
而且对于第 位,它的长度和上限为 。
CF1646F
如果每个人手上都拥有 的牌,我们只需要通过 次交换,就能完成要求。
因此我们现在的目标就是使每个人手上都是 的牌。
每轮我们重复以下操作:
-
先找到 1 个手上有重复牌的人,将其中一张重复牌传下去;
-
如果下一个人手上没有重复牌,就将与上一个人传递的相同的牌传下去;否则传递重复的牌。
这个操作显然也不会超过 次。
CF982F
题目就是要我们找到所有环的交点。
我们先找出一个主环,然后将这些点都“删掉”,再找一次环,如果能找到,说明答案为 。
接着,我们对主环上每个点 ,找到它不经过主环的边能到达主环上最远的点 (如果能到自己那就是最远的),那么我们将 到 的主环点都进行标记(利用差分),它们显然不能成为答案。
找到一个可能成为答案的点后,把这个点删除再跑一次找环,没找到的话,说明这个点就是答案。
有亿些细节。
CF325E
有一个神奇的方法,但我并不会证明。
首先,只有 为偶数有答案
我们考虑从后往前决策答案,由于后一个数奇偶性确定,那么操作也确定。
而我们的决策是优先选择 的数,如果被选过了,就选 的。
也就是说,如果当前数为 ,那么 优先选 ,否则选 。
CF1606F
显然,我们能删除的点不会超过 个。
因此我们考虑用根号分治。
-
当 时,我们直接统计答案:设 表示当 时, 子树的最大答案。
-
当 时,我们设 表示 子树删除 个点后, 拥有的子结点的最大值。
CF773E
我们 的变化一定是先一直减小,然后单调不降。
我们假设找出这个转折点 ,设 表示操作到 的答案,那么转移为 。
将它展开,有:
稍作转化,我们就可以维护 的最小值 ,答案就是 ( 为当前数的个数),可用线段树维护。
对于 这个点,我们直接在线段树上二分即可:当 时,说明还可以继续减,向右移;反之向左移。
CF1566F
我们可以先将开始就有点在上面的线段,以及有另一条线段是自己子集的线段给剔除。
那么现在就变成:(一堆线段) - 一堆点 - 一堆线段 - ... - 一堆点 - (一堆线段)
我们可以将一堆线段分给它左右两边的点;一个点可能要标记它两边的线段,因此最多会折返一次。
因此我们设 表示 点先向左 / 右走的最优答案。
对于向右走,我们将它放到 进行处理,这样方便我们切分同一堆线段。
DP 的时间复杂度为
CF1473F
一道网络流的好题。
一个经典的套路,将点分别与源点汇点相连,然后跑最小割,与源点相连表示不选,与汇点相连表示选。
但它有负权,我们考虑对连边做出一些修改:
-
如果 , 向 连出一条流量为 的边。
-
如果 ,那么 向 连出一条流量为 的边。
-
对于 且 ,那么 向 连出一条流量为 INF 的边。
这样,我们就可以跑最小割了。答案就是正点权和 最小割,
但边数有些超标,实际上我们第 边不需要全连,我们只需要枚举 的约数 ,与 最后一次出现的位置连边即可。
CF611E
一个大力分类讨论题。
首先,如果有 ,那么我们是无法完成任务的。
对于 ,那么必须要三个人一起完成。
对于 ,必须要 共同完成,而此时 也不能闲着,让他去从他能够打败的最大生命值的怪兽开始,能打一些是一些。
对于 ,和上一种情况同理。
如果 ,那么还要处理 的,处理方式和上一种一样。
接下来就是单独一个人能处理的怪兽了。
我们只需要本着优先处理自己能打败的最大生命值的怪兽的原则,进行分类讨论即可。
细节见代码。
CF1142D
打表找规律。
我们令 为排名 后的值,我们可以发现,对于 相同的数,在它们后面接上一位 ,得到的新数的 也是相同的(假设新数是合法的话)。
打表可以观察出变化的规律,将其预处理出来。
然后我们设 表示以 结尾,排名 为 的个数。
跑一遍 DP 即可,记得开 long long。
CF1685C
结论:不超过两次,一定可以将括号归位。
证明:我们将左括号看为 ,右括号看为 ,令 表示 的前缀和。
我们找到最大的 ,并翻转 。对于 ,翻转后有 。对于 ,翻转后有 。
接下来,我们只需要判断是否可以通过一次来完成。
假设翻转 可以满足,那么一定有 ,。
因此我们贪心地选择 最大, 最大的位置进行判断即可。
CF1469E
首先,无解的条件非常苛刻。
它必须满足 的二进制数,在串 的子串中都出现过。
因此,最后的答案有一段很长的前导零,有效部分长度不超 。
我们可以每次贪心地从高位开始填 或 。假设到第 位,我们先填零,然后看 位都与答案相反的情况下, 是否有 种不同的子串。
CF1713F
我们考虑 数组如何推到对角线。
为了方便,我们将 和对角线的横坐标从右往左重新编号 。
那么 会对对角线位置 贡献 次。
显然,如果要 ,那么必须满足 是 的子集。
因此,对 做一次超集和,就能得到对角线的值。
同理,由对角线推 ,就是做一次子集和。
现在要求倒过来,那么就是做子集和的逆,以及超集和的逆。
但由于基础操作是异或,因此我们不用考虑容斥系数的影响。
CF1392G
我们设 表示 相同位置的个数; 表示 执行了 的操作, 表示 执行了 的操作, 表示 执行了 的操作。
那么就有一个结论:。
而且,如果我们知道 与 的相同位置的 的数量,我们就能推知 。
因此,我们考虑维护 。
然后我们枚举 公共 的状态 ,检查 是否 即可,如果是就更新答案。
CF1149D
显然,在一个由 边连通的图中,他们的 边是没有用的。
因此,我们将原图看成若干个连通块,两两之间由一些 边连接。
对于两个连通块,他们之间最多只会选择一条 边,作为生成树的树边。
因此我们可以设计一个状态:: 表示已经离开的连通块,现在在 这个点, 到 的最短距离。
这个需要用最短路来更新。
但这样状态 就已经达到了 ,显然存不下。
我们再观察,可以发现对于点数 的连通块,我们并不用记录。因为从一个连通块再回来至少经过 条 边,而内部只需要经过 条 边就能互相到达,因此不会影响答案。
这样时空就压到了 了。
CF1375F
本来是一道很简单的题,但开始想错方向了...
可以想到,先手是必胜的:当他构造出一个等差数列,且后手不能操作最大那堆石子时,先手就赢了。
因此我们来分类讨论一下,假设 :
如果后手选择操作 ,那么需要给出的 要满足 ,那么 ;
如果后手选择操作 ,那么需要给出的 要满足 ,那么 ;
但先手如果选择操作 ,那么我们就没有好方法了。
实际上,我们可以先加一个极大的数(如 ),那么无论后手加到哪堆,那堆都会成为最大堆,那么下一次他就无法操作最大堆了。
CF1218G
一个朴素的想法,对于第 堆点,我们希望它们的点权满足
我们先跑出一棵生成树,对于非树边,边权都设为 。
考虑遍历这棵树。对于当前点 ,如果他的点权不满足上面的条件,那么我们就确定他到父亲那条边的边权。
但对于根节点,我们无边可改,这时候我们只能找出一个奇环,对环上的边交替 ,就能在不改变其他点的权值下修改根节点。
但如果不存在奇环,就无法完成操作。
这时候显然是一个二分图,我们考虑将点重新编号为 ,每个点依旧要满足 ,注意还是模 ,而且默认根节点属于 。
对于根节点 ,我们分情况讨论:
-
如果 ,那么我们不需要修改,因为他的权值一定和相邻的点不同。
-
否则,此时 。如果根只有一个儿子 ,那么显然 的度数大于 ,他们的权值一定不同;如果不止一个儿子,那么我们可以任选两个儿子,将连接的两条边权值都加 ,就能让 ,
CF1634F
tag:差分
斐波那契数列看起来就有很好的差分性质。
我们令 ,
显然,如果 序列与 序列相同,那么代表 也相同。
而我们在 加上一段斐波那契数列,就相当于在 加上 , 减去 , 减去 。 同理。
CF1041F
我们将上层点标为 ,下层点标为 ,我们假设从 (即上层点第 号点)开始反射。
我们手推一下,发现如果我们步长取 ,那我们会经过的点就是
而如果我们再取 ,那么上面能覆盖到的点就包括了这次覆盖的点了。
因此,我们的步长只会取 ,就可以在 内处理出答案。
__EOF__

本文链接:https://www.cnblogs.com/zuytong/p/17185383.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下