- 博客(184)
- 收藏
- 关注
原创 【CF】Day116——杂题 (动态规划 + 贪心 | 区间gcd + ST表 + 二分 | 容斥 + 数学 | 位运算 + 交互 | 二分 | 几何 + 交互)
动态规划 + 贪心首先这一题显然考察贪心,由于 a 是直接累加起来,b 是算前后差,因此我们肯定是要按照 b 的大小升序排列后选择,此时 b 的奉献就是 br - bl,即最后一个 b 减去第一个 b考虑动态规划,我们定义 f[i][j] 为 前 i 个选了 j 个的最小价值,这里的价值为,即减去第一个 b 后所有 a 的和为什么这样定义呢?
2025-07-31 12:09:15
421
原创 【CF】Day115——杂题 (构造 | 区间DP | 思维 + 贪心 | 图论 + 博弈论 | 构造 + 位运算 | 贪心 + 构造 | 计数DP)
构造题目意思很简单,就是让你分配位置,使得所有的女巫都能找到一个距离自己 a[i] 的房子注意到题目数据 a[i] 必定为偶数,因此我们将女巫分在对角线即可,然后根据 a[i] 判断往前还是往后即可。
2025-07-30 11:45:24
677
原创 【Luogu】每日一题——Day19. P8792 [蓝桥杯 2022 国 A] 最大公约数 (ST表 + 二分)
由于数据很大,不妨考虑优化,由于我们肯定是选择一段 gcd = 1 的区间,所以考虑使用 ST 表预处理区间 gcd,查询过程我们利用二分来找到第一个为 1 的点 (区间gcd具有单调性),然后更新答案即可,特别注意特判是否一开始就有 1 即可。暴力做法,我们直接枚举左端点然后往右端点行走,当gcd等于 1 时记录答案,时间复杂度 O(n²)这里其实可以使用双指针,但无所谓,能写出来就行。
2025-07-30 01:30:00
185
原创 【Luogu】每日一题——Day18. P1890 gcd区间 (ST表)
我们直接套用ST表求最大值的码,然后把 max 改成 gcd 即可。特别注意提前处理 log 更快哦。
2025-07-29 17:47:27
118
原创 【CF】Day114——杂题 (贪心 + 图论 | LCM + 贪心 | 最大最小子序列 + 图论)
贪心 + 图论首先我们将题目缩减一下,如果只有 a 点我们怎么写?显然我们的答案是 2 * (n-1) - mxdep,其中 mxdep 是节点最深的深度,为什么呢?因为既然我们要走完整个图,那么每一条路径都得走两边,而我们最后不需要回到出发点,所以我们最后走最长的路径即可,这样就不用走最长的两遍了那么现在有一个点 b 怎么办?我们贪心的想,我们肯定是让二者尽早回合最好,因为我们要让 b 走的无用功越短越好,所以我们让二者相向而行,二者回合的点就是一个新的根,然后以新的根做上诉操作即可。
2025-07-29 12:09:37
503
原创 【CF】Day113——杂题 (DP + 矩阵快速幂优化 | 背包DP变种 | 容斥 | 模拟 | 前后缀字符串哈希)
本题难点在于处理后缀哈希,不然想到我们可以只用字符串哈希进行 O(1) 判断,同时枚举 len 即可,由于有一个反转操作,因此我们还需要处理一个反转后的字符串的哈希,不过由于翻转固定从开头开始,因此我们可以直接先翻转整个字符串后做一遍正着的哈希即可。但是如果这样计算我们 1 2 3 都相同的情况就会被计算 3 次,因此我们还要减去 3*(1 2 3),这是我们不要的情况。由于本题只要求我们求有一个不同的,那我们不妨只记录不同的相同的,即 1 3,2 3,1 2 相同。这一题的关键点在于优化 n。
2025-07-28 14:17:13
353
原创 【CF】Codeforces Round 1039 (Div. 2) E1 (二分答案求中位数)
经典不过加了点东西对于求中位数,我们必然要想到二分答案,具体的,对于所有大于等于 x 的数我们令其奉献为 1,小于的为 -1,如果存在某段区间的奉献和大于等于 0,那么就说明这段区间的中位数大于等于 x本题也一样,由于题目要求长度要大于等于 k,因此我们要存储最小的左端点,且距离 i 大于等于 k,具体看代码。
2025-07-28 13:15:40
188
原创 【Luogu】每日一题——Day17. P2071 座位安排 (二分图匹配)
本题中由于一个人能选两排各一个位置,与常规板子不同这里我们有两排节点可以供我们匹配,因此我们考虑将父节点数组开个二维,这样我们就能往两个方向上寻找了。对于此题显然就是一个标准的板子魔改题。前置芝士:匈牙利算法。
2025-07-28 10:00:00
260
原创 【CF】Day112——杂题 (逆向思维 | 二分 + 贪心 | 单调队列优化DP | 二进制 + 前缀和 | 二分图判断 | 暴力枚举)
逆向思维对于这种有删除操作的题目,其实我们不妨去往逆向的方向想,这是一种模板了这题也是如此,我们不妨考虑一个一个加数字,然后全程维持最大值具体的,我们利用一个优先队列来存储数值,如果当前队列大小大于我们能选的数,那么就把弹出堆顶(此处为小根堆),答案即为 size * top。
2025-07-27 12:22:55
885
原创 【Luogu】每日一题——Day15. P1144 最短路计数 (记忆化搜索 + 图论 + 最短路)
具体的,先使用 SPFA 求出点 1 到 每个点 的最短距离,然后我们采取记忆化搜索,对于点 1,其答案初始化为 1,对于所有子节点,我们利用记忆化搜索枚举答案,对于一个点的子节点 u,如果满足 dis[u] = dis[fa] - 1,说明我们的 fa 可以从 u 转移过来,此时继续递归 u 即可。题目很简单,我们只需要先求出每个点的最短距离,然后用一次记忆化搜索即可。若对于有权图,那么我们则还需要在边上加上 w 这个元素。由于这一题是无权图,所以所有边权为 1 即可。
2025-07-27 10:30:00
252
原创 【Luogu】每日一题——Day16. P1433 吃奶酪 (状压DP)
状压DP,利用二进制来表示状态,同时枚举操作的DP,用于处理数据小的题目(N <= 21),复杂度略高。初学状压DP练手好题。
2025-07-27 00:30:00
183
原创 【CF】Day111——杂题 (差分 + 模拟 | 背包DP | 数学 + 贪心 | 状压DP | 贪心 + DFS)
对差分的绝妙理解首先我们看到这种题就要想到一定的套路,就是对于同一个点,其最多只会操作一次,因为每次操作都会影响 k 长度,对于同一个点操作两次显然是没用的(这里指的是操作同一个起点)所以我们不妨贪心的考虑,从左往右进行操作,如果是 0 就操作,否则就不操作,显然如果 k 可行那么一定可以全部变成 1。
2025-07-26 12:59:26
877
原创 【Luogu】每日一题——Day14. P5960 【模板】差分约束 (图论 + 最短路)
即对短路,所以如果我们能找到一个最短路满足所有的 dis[c] <= dis[c'] + 1 即可,所以我们直接跑一遍最短路即可。对于其他变种,如 xc - xc' >= y,此时有 xc >= y + xc',即变为了求最长路,此时改变一下不等式即可。我们将题目中的式子稍微变形,即 xc <= y + xc',此时的形态类似于 dis[u] <= dis[v] + w。对于无解情况,显然是存在负环时无解,此时的方程不断替换最后会形如 x <= x - c,显然无解。
2025-07-26 12:30:00
190
原创 【CF】Day110——杂题 (数学 + 构造 + 二进制 | 贪心 | 递归 + 模拟)
纯数学我们首先想想如果没 k 限制怎么办呢?显然我们直接选择 2 的 i 次方即可,其中 i 为 1 ~ 19但是现在有 k 怎么办呢?我们先尝试考虑构造 (1 ~ k-1),显然我们很容易就能构造出来,我们假设 k 的最高二进制位 为 j,那么显然塞入所有的 除了 j 的 1~19 都没问题,那么现在对于 1 ~ 2的j次方-1 可以随便构造,但是 (~ k-1)无法构造对此我们只需要假如 k -即可,因为原来的值域为。
2025-07-25 12:00:00
937
原创 【Luogu】每日一题——Day13. B3611 【模板】传递闭包 (Floyd | bitset)
主要思想就是 或 运算和 图论小知识,对于 i,j,如果 i 能到达 j,那么 i 就能到达 j 也能到达的地方,利用这个小知识我们就能顺利解决问题了。bitset 就是一个二进制数,但是我们能快速的更改指定位,同时又能像正常数字一样就行位运算。这一题其实就是一个 floyd 的板子题,我们主要学习 bitset 的用法。对于此题,我们可以直接利用 bitset 优化时间复杂度,降至 O(n²)和 floyd 一样,我们最外层枚举中间过度节点即可。图论小知识+bitset优化。
2025-07-25 11:00:00
191
原创 【Luogu】每日一题——Day12. P3149 排序 (树状数组 + 逆序对)
对于 k 我们也有限制,如果之前某次查询存在过一个 k' 有 a[k'] >= a[k],那么这次的 k 就不需要了,因为之前已经删过了,也就是说我们要存储一个最大的 a[k]由于 x > a[k],那么 即使重新排序了 x 的位置也不变,且 y 也依旧是 <= a[i] 的,所以没有影响。③.对于 x y,且 x <= a[k],y <= a[k],x > y。①.对于 x y,且 x > a[k],y <= a[k]②.对于 x y,且 x > a[k],y > a[k]
2025-07-24 21:12:28
133
原创 【CF】Day109——杂题 (数论 | 二分答案 + 区间哈希 | 二分 + 区间异或和 + 思维)
数论首先我们假设 gcd(a, b) = d,那么显然 a b 就能表示为 a = p*d,b = q*d则原式变为 (pd + qd) | (q*d*d),化简可得 (p + q) | (q*d),由于 p q 互质,因此 (p + q) | d所以我们可以暴力枚举 满足 gcd(p, q) = 1 的数对,但是直接枚举显然范围有点大,我们看看能不能进一步缩小。
2025-07-24 12:00:00
659
原创 【Luogu】每日一题——Day11. P10468 兔子与兔子 (区间哈希)
对于ABCDE,DE的哈希值就等于 ABCDE - ABC * p[r - l + 1] 的值,这个也很明显,我们乘以后面的洗漱后显然就是将 ABC 变成了 ABC__ ,即后面两个空格子,我们用 ABCDE - ABC__ 就是 DE 了,不过具体的其实我们可以使用算式验证一下,这里只是简单形象理解一下。对于区间哈希,我们使用的是类似前缀和的思想,如。区间哈希,处理字符串区间查询的好方法。所以我们直接模拟即可。
2025-07-24 10:15:00
285
原创 【Luogu】每日一题——Day10. P3370 【模板】字符串哈希 (哈希 + 字符串)
字符串哈希,值得是将字符串类似与 X 进制,是将一个字符串按照某种方式映射成某个数字的方法,通常我们取一个质数作为其基础值,同时用一个较大模数来约束。本题就是最基础的哈希映射,对于统计不同字符串我们可以将所有哈希值排个序,如果相邻相同那么就代表两个字符串相同,否则就不同。对于这种单哈希可能会被造数据卡,所以还需学习一些其他方法。
2025-07-23 12:15:00
171
原创 【CF】⭐Day108——CF (Div. 3) ED + Edu 181 (Rated for Div. 2) D (奉献 + 差分 | 数论 | DP + 概率)
拆奉献我们发现如果直接算会有些困难,不妨考虑假设如果存在某个 MEX 需要删除多少个数对于 0 1 1 2 2 3 ,假设 MEX 为 0,那么就有 0,01,011,0112,01122,011223 这几种删除数量的方法,即删除 1 2 3 4 5 6 个数,所有 0 会在 1 ~ 6 都做一次奉献,假设 MEX 为 1,同理我们可以删去 1 1 2 2 3 这些数,我们发现其会在 2 3 4 5 这些上做奉献。
2025-07-23 11:55:24
277
原创 【Luogu】每日一题——Day9. P1439 【模板】最长公共子序列 (DP)
举个例:对于 3 2 1 4 5,我们映射完后对映着 3-1,2-2,1-3,4-4,5-5,那么现在就可以当作 a 为 1 2 3 4 5,那么假如 b 是 1 2 3 4 5,那么映射完后就是 3 2 1 4 5,此时找新的 b 中的 LIS 即可,因为题目只让我们求公共子序列,并没有什么别的限制,所以这样的映射是可行的。显然就是 dp[i][j] = max(dp[i-1][j], dp[i][j-1]) ,即我们可以选择不要 s[i] 进行下一轮或者不要 s[j] 进行下一轮。
2025-07-22 13:44:20
254
原创 【CF】⭐Day107——Codeforces Round 837 (Div. 2) BCD (思维 + 计算子段 | 数论 + 质因数分解 | 回文串 + 区间DP + 图论)
很巧妙的一道题初试我们能发现一个特点,那就是这些区间有后效性,即如果在某个区间内如果有一个小区间,那么整个大区间就会被影响那这道题看起来很麻烦,但是我们有一个绝妙的方法解决,我们遇到这种计算某种符合条件的子段时还是得考虑单个点的奉献,本题我们以左端点考虑那么对于一个左端点,显然没有限制时能直接到 n,即奉献就是 n - i + 1,但是现在每个端点可能会收到某个限制,所以我们要考虑新的右端点在哪。
2025-07-22 11:54:18
822
原创 【图论】CF——B. Chamber of Secrets (0-1BFS)
什么是 01 BFS 呢?通常的 BFS 为一步权值为 1,而某些题需要的不是走到步数,而是某种操作数,如花费一个操作可以走 k 步,而不花费只能走 1 步,通常我们使用双端队列可插队的性质来进行代码的编写,具体的对于不花费,那么就插入到前面,而对于花费则插入到最后。本题中操作为 “四射”,所以按照上面描述很快能写出来代码。
2025-07-21 16:24:08
379
原创 【CF】⭐Day106——Codeforces Round 1038 (Div. 1 + Div. 2) CD (数学 + 贪心 + 计算几何 + 思维 | 最短路 + DP + 思维)
非常好题目,使我的思维旋转首先考虑一维情况,我们很简单的能发现一个性质,那就是只要将 x 坐标排序后再首尾配对即可探究其根本,其实我们发现:只要前者是从个小数中选,后者是从个大数中选即可,即对于一个数组 x,其满足 x[1] <= x[2] <= ... <= x[n],那么只要从前 1~n/2 中选 x[i],从后后 n/2+1 ~ n中选 x[j] 配对即可,即选择 (i, j) 配对满足 i 属于 (1, n/2) 以及 j 属于 (n/2 + 1, n)
2025-07-21 14:18:49
393
原创 【CF】Day105——Educational Codeforces Round 71 (Rated for Div. 2) DF (容斥 + 组合数学 | 根号分治)
简单容斥不难想到总方法数是 n*(n-1) / 2种,假设按关键字 1 升序有 cnt1 种,关键字 2 升序有 cnt2 种,那么显然答案就是 tot - cnt1 - cnt2 种但是由于排序会同时影响两边,因此我们还需要加上 cnt12,即 1 2 都是升序的情况cnt1 和 cnt2 求法一样,即 cnt1 =!c1*!c2*!c3*... 其中 c_x 代表数字出现的次数,因为数字相同我们就能随意交换,方案数就是!c_x 种那么 cnt12 怎么求呢?
2025-07-20 18:38:10
383
原创 【Luogu】每日一题——Day8. P13085 [SCOI2009] windy 数(加强版)(数位DP)
因为如果 lim 了,那么只有一种可能,即之前都是 lim,因为只有上一位被限制了,那么这一位才会被限制,这也是为什么 now > len 时直接返回 1,这代表原来的数就是一个符合条件的数,同时这个数不会被记忆化(如 135 这样的数,本就符合题意)对于最高位取 1 2,次高位取 1,我们下一个数都能取 1 ~ 9,也就是说我们会多次访问 dp[3][1] 这个状态,即我们现在在第三位,之前一位是 1。我们通常有两种做法,一种是 DFS+记忆化,另一种则是直接DP预处理所有情况然后统计。
2025-07-20 01:45:00
304
原创 【Luogu】每日一题——Day7. P2406 最小和 (数学 + DFS枚举 + 质因数分解)
由于 n,m是互质的,因此我们考虑拆解 c 的质因数分配给 n,m,由于二者是互质的,那么对于一种质因数只能分给一方,我们暴力DFS枚举枚举即可,然后求得最小值。我们令 x = a*n,y = a*m 则 gcd(n, m) = 1 是显然的,即 n,m互质,那么原式可变为。由于 lcm(x, y) = b,则有 x*y / gcd(x,y) = b,即 x*y = a*b。,此后令 c = b/a。
2025-07-19 13:30:00
251
原创 【Luogu】每日一题——Day6. U205150 本质不同子序列个数 (计数DP / 模板)
如果出现过,那我们就只能在 lastpos ~ i - 1 这些子序列后拼接,不然会重复,即 dp[i] = sum(dp[lastpos] ~ dp[i-1])如果 a[i] 之前没有出现,那么直接将 a[i] 拼接在后头即可,即 dp[i] = sum(dp[0] ~ dp[i-1])对于初始化,由于空集也算一个,因此 dp[0] = pre[0] = 1,如果题目不能有空集记得减去 1。我们定义 dp[i] 为以 i 结尾的本质不同的子序列数量,那么就有两种情况转移。
2025-07-18 14:00:13
123
原创 【CF】⭐Day104——Codeforces Round 840 (Div. 2) CE (思维 + 分类讨论 | 思维 + 图论 + DP)
纯思维题,但是理解错题意我们题目中说可以执行任意次操作,那么我们如果对同一个地方执行两次操作呢?显然这一块都将变成 0,那么我们就能执行最优操作了我们分类讨论一下:①. n >= 4此时我们无论最大值 mx 处于哪里,我们都能将所有值变为 mx,如果处于中间,那么就直接将两边全变为 0,然后再变成 mx 即可,如果处于端点,那么也是一样的操作,如果处于次边缘(如第二个),那么就要有点细节了,先把一边全变成 mx,然后再把第一个和第二个变成 0,最后再变成 mx②. n == 2。
2025-07-18 12:26:36
483
原创 【CF】⭐Day103——2025四川SCCPC (IFJKHAC)
字典树字典树板子题,我们只需要把字符串反过来然后插进字典树即可,而计算不同的后缀其实就是找有多少个已经出现过的点,然后用 s.length - 点数 就是一个字符串的奉献。
2025-07-18 00:45:00
665
原创 【Luogu】每日一题——Day5. P10155 [LSOT-2] 基于二分查找与插入的快速排序 (贪心)
那么从最后一个位置往前找,如果当前位置的数大于之前遇到的数的最小值,如 3 1 4 2 5,我们先检查 5,然后检测 2,发现 2 小于之前最小值(5),因此相对位置正确,我们不移动,然后检测 4,发现其大于之前最小值(2),此时相对位置错误,所以我们就要移走,以此类推。首先我们肯定是先从大到小排序,这是显然的,但是如果要模拟这个过程的话有点麻烦,我们不妨考虑哪些数不需要移动。这样模拟一遍我们就知道哪些数相对位置错误,哪些错误的位置就要移走。首先最后一个数肯定是 n,否则无解。
2025-07-17 13:58:25
229
原创 【CF】⭐Day102——Codeforces Round 841 (Div. 2) CD (异或的性质 + 前缀和求异或区间 + 数论 | 二分答案 + 二维前缀和)
考察了一些小知识,非常好首先我们要理解题目意思,也就是说找到 所有 子区间的异或和的值 满足 因数数量为偶数 的数目那么我们就要知道一个小结论:完全平方数的因数数量为奇数我们发现这一题如果正着求很难受,但是如果我们反过来想就容易多了,我们只需要知道 子区间异或和 为完全平方数 的数目有多少个,然后再用总的子区间数目减去即可所以我们可以考虑对于每一个位置 i,看看前面有多少个 j 满足 sum[i] ^ sum[j] = x(其中 x 为完全平方数,sum 代表前缀异或值)
2025-07-17 08:00:00
532
原创 【Luogu】每日一题——Day4. P5804 [SEERC 2019] Absolute Game (思维 博弈论)
由于 A 其实是可以任选的,而 A 选完后 B 就会受限制的选择,所以我们可以暴力枚举 A 最后选什么,然后就能得出 B 选什么了。因为我们上面只约束了 B,而没考虑 A 的约束,因此我们要时刻记录最大值来充当 A 的约束。具体的,对于 A 选的任意数 x,B 一定会选择一个最接近 x 的数 y,使得 abs(x - y) 最小。因此我们可以暴力枚举 x,然后 二分 找到 y,最后从所有的 abs(x - y) 中选一个最大值即可。不难想到,由于二者都是最优的,那我们只需要考虑最后的结果就行了。
2025-07-16 13:33:44
202
原创 【Luogu】每日一题——Day3. P6392 中意 (数学 取模)
题目让我们求这个结果对 MOD 取模,那么我们肯定是不像看到这个除法,所以考虑如何消除这个除法。我们可以想到,向上取整就是加上一个数,假设其为 x,那么原式就可以变成。然后求得 x 后按照上面的公式计算即可,特别注意要使用快速幂加速运算。那么问题就变成了如何求这个 x,很显然,这个 x 就是。所以我们可以拆开来求,具体步骤写代码中了。,此时就能将 25 化简掉。那么如何求得这个结果呢?
2025-07-15 19:58:10
221
原创 【CF】⭐Day100——CF 843 (Div. 2) CD (lowbit + 位运算 | 质因数分解 + 根据条件建图 + 最短路) + CF 842 (Div. 2) D (置换环)
除了树状数组中用了lowbit,没在别的地方用到过,没想到还能这样用首先题目让我们找一个 m,使得 n & n+1 & n+2 & ... & m-1 & m = x那么显然 x <= n,那我们如何构造呢?显然既然 x<= n,那我们肯定要不停缩小 n,使得其趋近 x,那么既然要让 n 减少,那么只有从最低位开始去除 1,而如果要去除 1,那么显然最小的 m,就得是 n + lowbit(n),为什么呢?
2025-07-15 14:01:38
401
原创 【CF】⭐Day98——Codeforces Round 845 (Div. 2) CD (因数分解 + 双指针 | DFS + 数学 + 奉献)
还以为时间复杂度过去不呢显然我们可以先将数组排序,因为我们假设答案是 ans,那么假设最小值我们选了 a[l],那么显然如果存在 a[r] 可以选择,那么选择 l ~ r 区间内所有的数都是对答案没影响的,甚至更优的因此我们可以暴力枚举一遍,如果某一时刻能解决所有题目,那么此时就缩小左端点知道无法解决所有题目同时对于判断一个数能解决那些题,我们可以提前预处理 1~1e5 的所有数,预处理部分可以复习一遍枚举部分看代码,注意判断是不是能解决一个题目的条件。
2025-07-14 14:08:34
350
原创 【Luogu】每日一题——Day2. P9612 [CERC2019] Light Emitting Hindenburg
如果某一位有 cnt 个数的第 i 位为 1,且 cnt >= k,说明这些数是我们可选方案内的数。题目化简:给定你 n 个数,让你选定 k 的数使得其按位或和最大。由于题目告诉我们了最多 30,所以暴力枚举 0 ~ 29 位即可。那么每次枚举我们就可以知道哪些数能放进预选方案,哪些直接排除掉。根据贪心思想,我们肯定是选高位最好,所以从高位向低位枚举。具体实现看代码,还是很简单的 贪心 + 位运算。
2025-07-12 09:00:00
182
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人