- 博客(127)
- 收藏
- 关注
原创 【CF】Day82——Codeforces Round 869 (Div. 2) CD (前缀和 | ⭐无向图找环)
前缀和立大功一个很显然的想法,我们可以拆开整个序列来看看,我们将序列分为 递减子序列 和 剩余情况,那么对于一个递减子序列,其前后要么就是其余情况,要么就是没有元素那么贪心的想,对于一个递减子序列,我们能选多少个元素呢?显然最多选两个,所以我们可以考虑前缀和来做我们定义 sum[i] 为前 i 个元素中有多少个元素是 x >= y >= z 的那么答案就是 len - (sum[r] - sum[l+1])为什么是这个呢?
2025-06-12 14:07:04
135
原创 【CF】Day81——Codeforces Round 870 (Div. 2) D (思维 + ⭐题目转换 + 前后缀)
挺好的思路转换,以及需要一点观察我们首先要知道一个事实,就是我们如果选的话一定会选则 bl br 和 l~r 中的一个 bi,为什么呢?显然如果不选 bl 和 br,说明此时内部还有更优的子区间选择,那么由于前面 bi1 + bi2 + bi3 大小不变,而 r - l 变小,那么肯定是更优的。
2025-06-11 14:00:04
142
原创 【CF】Day80——Codeforces Round 872 (Div. 2) C⭐D (思维 + 模拟 | 树 + 思维 + 组合数学 + 分数取模)
简单思维题题目告诉我们一堆步骤,但是其实很简单就能看出来一些端倪首先我们一定可以放入所有的 xi > 0 的点,且在此基础上我们可以选择放入全部的 x = -1 的点和 x = -2 的点证明:以左边举例,假设前 i - 1 个数都填上了,如果当前点 i 没有对应的 x = i 点,那么就消耗 x = -1 的点,否则消耗 x = i 的点因此这是两种答案,那么如果两个都放呢?由于两个都要放,那么显然就要以一个点做分界点,然后将所有的 -1 放入左边,所有的 -2 放入右边,为什么呢?
2025-06-10 21:12:10
378
原创 【CF】Day79——Codeforces Round 875 (Div. 2) D (数学 + 思维 + 暴力枚举)
纸老虎,但是老虎,还是挺吃细节的我们来分析一下条件,由于每个数都是在 1 ~ n 的范围内,显然是非常有用的,因为一下子就确定了答案的上界,即 bi + bj <= 2*n 恒成立,那么由于 ai * aj = bi + bj <= 2*n,那么当 ai = aj 时,可确定一个条件,对于任意 ai aj,其中必有一个数满足 a <=,此后令 mx =
2025-06-08 11:40:44
270
原创 【CF】Day78——⭐Codeforces Round 876 (Div. 2) D (LIS | 思维 | DP)
如果我们选择接上去了,那么中间的数肯定都要被操作掉,如 2 3 (1) 4 ,其奉献就是 1,即LIS中间的数的个数,表示出来就是 j - k - 1,转移方程就是 dp[i][j] = min(dp[i][j], dp[i-1][k] + j - k - 1)那么考虑另一个特殊情况,如果 a[i] > a[i-1] 那么 a[i] 就可以直接接在前面的 LIS 后面,且不会增加奉献,那么就有 dp[i][j] = min(dp[i][j],dp[i][j-1])思路想到了LIS,但是不知道怎么dp。
2025-06-07 12:01:36
317
原创 【CF】Day77——Codeforces Round 877 (Div. 2) BCD (构造场)
考虑了一半,小失误首先我们考虑答案至少有几个,显然至少有两个,一个是 1,一个是 1 ~ n,即只选 1 和 全选那么再考虑是否能让答案只有这两个呢?显然是可以的,我们只需要将 n 放在 1 和 2 的中间即可,即 1 n 2 或 2 n 1 的形式,因为如果要有 2,那么必须就要经过 n,那么此时如果不全选是无法构造出一个排列的,所以这个方法可行,同时也只需要一步。
2025-06-06 10:23:43
740
原创 【CF】Day76——⭐Codeforces Round 879 (Div. 2) DE (数学 + 思维 + 区间问题| 数学 + 思维 + LCM)
挺好的一道思维题,不是很难我们写这种区间问题的时候无非就是考差分和相交不相交的问题这题我们分析一下就是考究一个相交最少的区间的问题我们转化一下思路,根据贪心的思想,我们可以枚举每一个人当最大的那个值,那么我们就可以去寻找最小的值来计算答案,假设当前枚举的区间的长度是 len,那么寻找一个与其相交最少的区间当最小值即可那么最后的答案就是 (len - 相交的区间长度)* 2那我们如何寻找与其相交最少的区间呢?
2025-06-05 10:39:25
333
原创 【CF】Day75——CF (Div. 2) B (数学 + 贪心) + CF 882 (Div. 2) C (01Trie | 区间最大异或和)
贪心数学我们很容易想到,我们肯定是每个人分配 (g - 1) / 2 个银币最好,这样就能全贪走剩下的了,同时我们也最多只能贪这么多,我们假设给前 n-1 人分配好了这么多个(假设硬币够多),那么最后一个人最好全收下所有硬币,为什么?如果不收下,那么就会分给别人,那么现在所贪的数量肯定不会优于之前的,最多只能等于,而最后一个人也只能贪 (g-1)/2 个硬币,所以不如全给最后一个看看还能不能贪特别的,由于硬币数量可能不足,所以我们还需要取min。
2025-06-04 11:22:49
339
原创 【CF】Day74——⭐Codeforces Round 885 (Div. 2) ACD (数学场)
经典博弈题,考虑奇偶性我们来看看简单版,即只有一个追逐者的情况我们可以将网格划分成一个国际象棋的棋盘,然后再来观察题目如果二者处于相同的颜色格子中,那么就一定能追到,否则一定不行,具体的来说,如果二者的距离是偶数,那么就一定能追到,否则一定不行。
2025-06-03 17:32:16
893
原创 【CF】Day73——Codeforces Round 887 (Div. 2) B (思维 + 模拟)
比C题有意思,但也么意思对于这一题我们可以考虑最小的情况,即 f0 = 0,f1 =1 时,然后看看什么时候会超过 n 的最大值,我们可以发现 k > 30 时就炸了,所以如果 k > 30 就可以直接输出 0然后我们讨论 k <= 30 的情况即可,我们发现如果正向考虑是很难的,所以我们反向考虑。
2025-06-02 17:10:06
249
原创 【CF】Day72——Codeforces Round 890 (Div. 2) CDE1 (二分答案 | 交互 + 分治 | ⭐树上背包)
二分挺好想的,但是check有点不好写看到最大值,试试二分,如果 x 可以,那么 x - 1 肯定也可以,所以具有单调性,考虑二分如何check呢?由于 n 很小,我们可以考虑 n² 的 check,我们可以考虑枚举每一个位置为 mid,那么如果这个位置要是 mid 那么下一个位置就起码是 mid - 1,以此类推,直接模拟即可特别的,由于 n 处无法继续往后,所以记得判断一下。
2025-06-01 11:55:53
1154
原创 【CF】Day71——⭐Codeforces Round 892 (Div. 2) D (二分 + 思维 + 差分模拟区间合并)
我们找到第一个左端点大于 x 的区间,那么这个区间的前一个的左端点肯定就在 x 左边,然后选择跳or不跳两个操作,即 x = max(x,r),因为我们的 x 值可能大于 r 但小于下一个 l,所以我们得取最大值。然后就是查询操作了,对于查询操作,我们只需要考虑它在哪个大区间内即可,显然暴力枚举不行,所以我们得考虑优化,可以发现最后的区间的左端点都是单调递增的,所以我们考虑二分。但是这样的做法显然会超时,每次查询都是 n 的复杂度,所以我们得优化一下,那我们来好好利用题意。很有思维的一题,非常nice。
2025-05-31 10:30:15
300
原创 【CF】Day70——Codeforces Round 896 (Div. 2) CD1 (排列 + 构造 | ⭐思维 + 数学)
感觉似曾相识对于这种排列+构造的题目,我们肯定是先找规律然后再想构造(虽然我结论想出来但没找到一般构造方法)由于这一题是求 mex ,那我们可以尝试看看能不能构造出最大的的答案,就对于 4 3 这个例子,我们看看能不能使得每列的 mex 分别为 0 1 2,这样最后答案就是 3,答案是显然的,手动画画就知道是可行的,那我们继续尝试 n = 3 2 1 时的情况,我们可以发现一个结论,即答案是 min(n+1,m),那么如何构造呢?这里直接给出cf官方的方法。
2025-05-30 11:09:36
404
原创 【CF】Day69——⭐Codeforces Round 897 (Div. 2) D (图论 | 思维 | DFS | 环)
非常好的一题对于这题我们要学会转换和提取条件,从特殊到一般我们可以考虑特殊情况先,即 k = n 和 k = 1时,对于 k = 1,我们可以显然发现必须满足 b[i] = i,而对于 k = n 时,我们可以发现一个特点,比如对于 2 3 1 这个例子,我们可以一个一个构造,对于 2,我们肯定是构造一个 1 2 这样的结构,对于 3 那就是 2 3,对于 1,那就是 3 1,所以最后的 l 可以是 1 2 3我们试着进一步讨论,可以发现其实这样的一个结构:第 i 个节点指向第 b[i] 个节点。
2025-05-29 11:44:35
526
原创 【CF】Day68——⭐CF 912 (Div. 2) BCD1E (思维构造 + 位运算 |思维 + 贪心 + 后缀和 | 位运算 + 贪心 | 交互 + 博弈论)
太多了,所以分两篇,这场题目都挺好的。
2025-05-28 16:49:51
633
原创 【CF】Day68——CF 1026 (Div. 2) CD (模拟 | 二分 + DFS + DP) + CF 1027 (Div. 3) E (⭐DFS + 树上前缀和 + 最大区间和)
由于我们要确保最后的电池数量要为 mid,而走边需要看你目前有点电池数量,那按照贪心的想法,只要我们目前的电池小于 mid,那我们肯定是多拿电池最好,否则我们就不需要拿电池了,所以我们可以使用 dp,转移就是 dp[v] = max(dp[v] ,min(dp[u] + a[u],mid)),这样我们只需要走边的同时储存该节点的最大电池数量,最后走下一条边的时候看看能不能走即可,只要最后 dp[n] >= 0就说明我们走到了 n,此时就是 true 否则 false。具体实现看代码,还是很好理解的。
2025-05-28 13:38:06
615
原创 【CF】Day67——Codeforces Round 873 (Div. 2) CD1 (排列组合 | 单调栈)
简单数学题目让我们使得 ai > bi,那我们如何构造呢?我们可以反向思考对于一个 ai ,我们能用二分很快求得 b 中有多少个数大于 ai,我们记作cnt,也就是说 ai 的选择有 cnt 种,同理我们能将所有的 ai 的cnt都求出来,但是我们要讲究一个顺序,如果我们先找小的ai,那么如果这个小的选了大的 bi,那么对于大的 ai 如果其需要这个 bi,我们就会出现bug了。
2025-05-27 09:32:22
476
原创 【CF】Day66——Edu 168.D + CF 853 (Div. 2).C (树 + 二分 + 贪心 | 组合数学)
我们可以这样想,由于每次只改变一个数,那么也就是说如果某个数一直没改变,那么最后肯定有 m + 1 个,而如果中间改变过,那么肯定在改变之前这个数就一直存在了,也就是连续的某一段全含有 x,所以我们可以存储 last[i] 代表上一个数是否存在,以及如果存在它的位置在哪里。对于一个数 x,如果 我们选了一个 没有 x 的数组,那么奉献就是 1,取有 x 的数列,奉献也是 1,但是这是两种不同的取法,所以我们可以分开计算(特别的一共有 m + 1个数组,因为还有初始数组)很考验实现方式的一题。
2025-05-26 21:16:30
510
原创 【CF】Day65——Educational Codeforces Round 169 (Rated for Div. 2) DE (图+贪心+前后缀 | ⭐SG函数)
由于 我们取不到 sg(p),而后面的数如果是 p 的倍数也都取不到,那我们根本就取不到 sg(p) 了,同时对于其余大于 x 的数,如果其与 x 互质,那么它要不就是质数,要不就是偶数,而如果他是质数那么它的值肯定比 sg(p) 大,而偶数又全是 0。然后我们来探讨其规律,我们可以发现一个特征,只要一个数是偶数,那我们就不能取对应的偶数,比如 4 不能取 2 和 0,而如果我们取不到偶数,那么我们的 sg值中的 mex 就不能有 0,也就是说最后的 sg值一定是 0,所以偶数的 sg值均为 0。
2025-05-22 11:22:30
439
原创 【CF】Day64——Educational Codeforces Round 173 (Rated for Div. 2) BCD (数论 | 最大连续子段 + 最大前后缀 | 数论)
7比较特殊,可以记一记直接上结论那么 1 和 5 可以直接判断,而 3 和 9 稍微有点特殊,由于其是位数之和能被 3/9 整除,我们假设有 k 位,也就是说只要满足 k * d % 3/9 == 0 即可 那么 d = 3/9 的情况可以直接出,其他情况就和 k 有关了,如果 k 中有 3 / 9 就行,那么 n 要满足什么条件呢?
2025-05-21 12:13:21
841
原创 区间内最远互质点对
我们可以枚举 x 以及区间长度 len,那么 y 就是 x + len,如果有 gcd(x,y) = 1,那么就可以直接输出答案了,时间复杂度看似为 O(len²),但实则不然。具体的证明可看洛谷评论区,be like。
2025-05-20 22:39:08
175
原创 【CF】Day63——Codeforces Round 945 (Div. 2) BC (二分答案 | 思维构造 + 贪心)
二分题,关键在于能否看出二分由于这一题中条件是 |,那我们就能知道 只要区间内一个数有某个位为1 那么这个区间或完后这个区间最后值这一位肯定也是 1这道题我们观察可以发现,如果 k 能满足,那么 k + 1 也能满足,为什么呢?比如 k = 2,有 a1 a2 a3 a4 a5 五个数,如果 2 可以,说明任意相邻两位异或和相同,那么任意连续三位肯定也相同,如 1 0 1 0 1 就是一种情况。
2025-05-20 08:49:11
695
原创 【CF】Day62——Codeforces Round 948 (Div. 2) CD (思维 + LCM + 枚举因数 | 思维 + 哈希)
非常好的思维题,顺便复习了一下快速枚举因数和lcm的性质我们先来看答案的上界,即全选,此时说明 lcm(a1,a2,a3,...) > a_max 其中 a_max 为 a 中最大的数,那么如果答案不是 n 呢?既然不是 n,也就是说如果我们全选的话这个数会出现在 a 中,而如果要出现在 a 中,显然这个数一定是 a_max那么我们可以假设最后不在 a 中的 lcm 为 m,而根据 lcm 性质我们可以知道子序列的lcm 肯定是整个序列lcm 的一个 因数 x。
2025-05-19 22:01:58
401
原创 【CF】Day61——Codeforces Round 939 (Div. 2) CD (思维构造 | 思维构造 + dfs枚举)
所以我这里定义一个递归函数 operation,其作用是储存一个区间构造成 0 1 2 3 ... len 的操作步骤,那么按照上面说的,我们就要先operation(l, r - 1),然后再 改变 l ~ r,然后再 operation(l,r - 1),如果 l == r,那么说明是 0,那我们就跳过即可。答案是显然可以的,我们来看看如何构造,我们可以从后往前构造,即我们先填最后一列和最后一行,然后再填倒数第二列和倒数第二行,以此类推,最后刚好 2*n 次。假设 n = 3,我们考虑能否构造出。
2025-05-18 19:32:34
307
原创 【CF】Day60——Codeforces Round 936 (Div. 2) CD (二分+DFS / 位运算+贪心)
二分 + DFS,不错的结合首先我们要发现这题有单调性,为什么呢?我们假设 x 可以是最小值的最大值,那么 x - 1 肯定也是能构造出来的,因为我们可以将 x 多减一次,这样就能变成 x - 1 了所以我们可以愉快的二分了,那么如何check呢?既然我们要最小值为 mid,那么我们只需要在 dfs 时遇到 子节点数 大于 mid 时我们裁剪一次即可,同时如果裁剪了那么这一个联通分量也就单独出来了,此时其对父节点的贡献就为 0 了。
2025-05-16 10:45:32
866
原创 【CF】Day59——Codeforces Round 914 (Div. 2) D
当然,我们再想想,如果我们向左找的时候遇到一个点有 b[j] < b[i] 会发生什么,如果我们要替换,无论此时 a[j] = b[j] 还是 a[j] < b[j] ,既然我们包括了这个区间,那么最后 a[j] 一定会变成 比b[j] 更大的 b[i],因此我们遇到 b[j] < b[i] 时也要停止。显然,如果 a[i] > b[i] 时是无法构造的,同时 a[i] = b[i] 时就不用管了,所以我们直接看 a[i] < b[i]找是找到了,但是那些判断怎么写?但是没有什么特殊条件吗?
2025-05-15 16:56:10
344
原创 树的直径 | 树的最长路径
我们定义 d1 d2 为每个节点往后延申的最长路径和次最长路径,为什么要存储 d2 呢?因为可能存在以另外一个节点为根节点时的最长路径为 d1 + d2,我们默认根节点为 1 ,所以没考虑上述情况,所以应该存个次最长,然后在 dfs 中时刻存储最大长度即可。这一题的边的权值不一样,倘若有负边的话我们无法使用定理来做,那我们可以考虑树形dp(虽然这题没有负边)由于这题中每条边的权值都为 1,因此可以直接使用定理来解决。
2025-05-14 15:33:12
289
原创 【CF】Day58——Codeforces Round 1024 (Div. 2) CD + Codeforces Round 958 (Div. 2) CD
比较猜的一题感性的想,我们肯定是要让 0 在的子矩阵数量越多越好,因为如果没 0,那么mex就是 0,所以 0 我们肯定要放中间,同时我们将这个想法扩展一下,对于所有的数,我们肯定要越靠近之间的数越多越好,比如 1 肯定要靠近 0,2 肯定要靠近 0 1,以此类推最后我们可以发现螺旋画圈的一种构造方式刚好符合我们的需求,模拟的时候注意即可。
2025-05-14 12:33:52
603
原创 【CF】Day57——Codeforces Round 955 (Div. 2, with prizes from NEAR!) BCD
简单模拟很简单的模拟,我们只需要快速的找到下一个离 x 最近的 y 的倍数即可(要大于 x)这里我们可以这样写 add = y - (x % y),这样就知道如果 x 要变成 y 的倍数还要增加多少个数然后模拟即可注意,这样操作有限次后如果 k 足够,那么最后 x 一定会变成 1,此时将进入一个循环,每经过 k - 1 此后 x 又会变成 1,这样我们就能很快算出来了。
2025-05-12 23:29:37
468
原创 【CF】Day56——Codeforces Round 940 (Div. 2) and CodeCraft-23 BCD
简单思维题首先我们肯定可以想到,答案的值不可能超过 k 的最高有效位,比如 1011,答案最多只能是 4 位,那我们考虑时候可以构造出一种方法使得刚好能填满呢?我们考虑到,如果一个数他是 1111 这种形式,那么可以直接放这个数即可,但是如果是 1000呢?首先我们最优的情况肯定是将后面的 0 全变为 1,且这一定是最优的,因为如果我们可以通过舍弃最高位而获得后面的所有位,比如 1000 我们可以使用 0111 0001 两个构造出,此时答案是 3,可以看出这显然是最优的。
2025-05-10 13:57:33
609
原创 【CF】Day55——Educational Codeforces Round 163 (Rated for Div. 2) DE
略微思维一点的题看到题目中的 n <= 5000,我们就可以尝试一种 O(n²) 的做法我们先看看暴力写的话怎么做,显然我们可以枚举每一个点作为起点然后对于这个点尝试每种长度的可能,那么这样的话时间复杂度是,即 枚举起点+枚举长度+一个一个枚举判断那我们该如何优化呢?一开始我打算使用dp,因为这有点区间dp的感觉(?
2025-05-09 13:22:06
682
原创 【CF】Day54——Educational Codeforces Round 161 (Rated for Div. 2) DE
考优化这题复杂度很迷,但均摊下来大概是 O(n)这题没什么思维,但是很需要优化,首先我们可以直接模拟一遍,但是如果没考虑优化的话我们就会超时我们从两个点上考虑,第一我们考虑如何快速获取一个怪物左右两边的怪物,如果我们使用vector模拟,那我们可以考虑使用erase来删除元素,这样只需要读取 i -1 和 i + 1 即可,但是由于每次删除都要重新排,所以时间复杂度是很大的,因此我们可以考虑另一种数据结构,这种要获取左右元素的情况我们能想到什么呢?答案肯定是链表。
2025-05-08 19:14:05
906
原创 【Lanqiao】数位翻转
写蓝桥不能不写dp,就像....题目数据给的不大,所以我们可以考虑一种 n*m 的做法,那么对于这种题目可以想到的是用dp来写,但是如何构造转移方程与状态是个难事由于这题对于任意一个数我们有两种可能,即翻转or不翻转,那么肯定要有一维代表这个,同时我们还有一个数m,我们可以决定一共翻转m个,所以还可以用一维表示这个,那么我们就能想到一个暴力的dp,我们定义 dp[i][j][k] 为前 i 个数一共翻转了 j 个区间且当前数是否翻转了对于 dp[i][j][0],即当前没翻转,那么可以从哪里转移呢?
2025-05-07 21:04:27
382
原创 【CF】Day53——Codeforces Round 1023 (Div. 2) CD
简单题,但是我没考虑到负数题目让我们将原来不知道的地方填充起来,然后确保最大子段和恰好为 k我们来看看什么时候无解,显然当没填充时就存在一段最大字段和大于 k 时,那么我们无论放什么数都不可能有解那么如何知道最大子段和呢?这里运用一个动态规划即可,我们定义 dp[i] 为前 i 个数中最长的子段和,那么就有 dp[i] = max(dp[i-1] + a[i],a[i]),简单dp在此不做赘述。
2025-05-07 15:52:09
770
原创 【CF】Day52——Codeforces Round 977 (Div. 2, based on COMPFEST 16 - Final Round) C2
注意细节,防止脑抽本题和简单版其实是一样的,主要思路都是确保每一个数第一个出现的顺序都要升序排列由于我们不需要知道具体的值,我们可以将 a[i] 做一个映射,将 a[i] 变成 i,这样方便后续写题那么 b[i] 也按这样映射,这样的话我们只需要判断是否存在 pos[i] > pos[i+1] / pos[i] < pos[i-1]即可,其中 pos[i] 代表 i 第一个出现时的位置由于对于每次更改,只会影响其前后两个点,也就是最多四个点,那么我们就需要一种快速的方式来更改某个数第一个出现的位置。
2025-05-06 08:40:53
146
原创 【CF】Day51——Codeforces Round 963 (Div. 2) CD
思维+数学我们首先肯定能找到一个规律,那就是开灯的时间戳是 a[i] + 2*k*x (x >= 0),且这是规律性的,那么最后的答案一定是在 max(a[i]) ~ max(a[i]) + k - 1 之间的,因为后面最晚亮的灯熄灭了,那么就要重新开始循环了,比如假设答案是 m,那么之后的答案也是 m + 2*k那我们如何写呢?
2025-05-05 17:18:56
568
原创 【CF】Day50——Codeforces Round 960 (Div. 2) BCD
有点意思的构造首先题目告诉我们 y < x,这是一个重要的条件我们先来考虑简单情况,假如可以放0进去,那么我们只需要在 y ~ x 之间全放 1 ,其余都是 0 即可,但是现在只能放 1/-1,因此我们必须要想另一种方法。
2025-05-03 23:24:18
660
原创 【CF】Day48——Codeforces Round 979 (Div. 2) D
思维题,但是还考实现能力首先我们要知道什么情况是不能换位置的,为什么时候是需要换位置的我们先看前一个问题,如果不能换位置,那么肯定是 LR 这样的结构,这样的话L和R中间相当于有一条分界线,此时L左边的数最多只能在左边的区间内移动,R同理那么什么时候需要换位置呢?显然如果一个数 x 的位置不在数组中的 x 位置时,那么就说明要换了,但是我们肯定还要判断这个数要换到哪里去,同时我们肯定还要考虑到分界线,那我们怎么写比较好呢?
2025-05-01 11:16:55
249
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人