- 博客(255)
- 收藏
- 关注
原创 【LeetCode】327. 区间和的个数
利用容斥的思想,我们可以求出 区间和小于等于 x 的数量,这里记作 query(x),那么原题就能转变为求 query(r) - query(l-1)对于上述的 r 和 l,其对于的就是 sum[i] - low 和 sum[i] - up,那么由于我们要的是 l,所以不如直接离散化 l - 1。特别的,我们离散化的应该是前缀和 sum[i],以及 sum[i] - low 和 sum[i] - up - 1,为什么呢?可以想到我们可以使用一些数据结构来计算,这里使用方便实现的树状数组即可。
2025-09-29 11:15:00
367
原创 【Luogu】P5094 [USACO04OPEN] MooFest G 加强版
那么小于 x[i] 的奉献就是 x[i] * cnt - big,对于大的则是 sum - big - x[i] * (i - cnt)对于第 i 个位置,前 i - 1 个位置肯定都小于当前位置,所以我们直接就知道本位置的 v[i] 了。具体的,我们求 i 前所有小于 x[i] 的数的 总和 big 和数量 cnt。实际求的过程中我们只需要计算一部分即可,因为另一部分可以利用前缀和求出来。对于这种求 max 的操作好像很麻烦,但是如果我们排序后就好求了。我们可以拆成两部分,一部分是大于,一部分是小于。
2025-09-27 23:16:25
213
原创 【CF】G. Good Key, Bad Key (动态规划 / 贪心)
非常好dp,使我的代码旋转贪心:动态规划:我们可以定义 f[i][j] 为处理到第 i 个数且用了 j 个坏钥匙的最大价值,但是这样的话就是 N² 的复杂度了,所以考虑优化注意到每次都会使得 i 以及后面的所有数减半,因此使用坏钥匙超过 30 次那么后面的价值都是 0,因此不需要考虑了,那么转移也很简单了,看代码即可。
2025-09-25 18:37:49
248
原创 【AtCoder】F - Adding Chords (破环成链 + 异或哈希 + 树状数组)
异或性质 + 经典trick遇到环上问题 or 树上问题,我们都可以往链上想本题就是破环成链,我们将一个线段放在链上,可以发现其连接了两个点,那么如果此后如果加入了一个线段,那么就有以下三种情况(红色线段是最先画的,其余线段是下一个加入的线段的可能情况)①.新加的线段与原来的线段端点不相交此时显然是没有相交的②.新加的线段与原来的线段端点 相交一个此时就是二者相交了③.新加的线段与原来的线段端点不相交此时显然是没有相交的。
2025-09-23 12:30:00
263
原创 【CF】Day147——杂题 (反向操作 | 二分图判断 | 思维)
经典trick遇到这种有序的操作题,不妨考虑倒着操作我们用一个栈来维护当前买了的价格,那么每次遇到 - 我们就加入栈中,如果本次加入的价格大于栈顶,那么此时无解,理由显然:如果之前的价格更小,那么我们买的时候就会先买小的,此时矛盾同理对于每次遇到 + 我们就出栈,特别注意,如果栈此时为空也是无解的,说明会有人在没有一把匕首的时候买了匕首模拟即可。
2025-09-22 17:00:00
267
原创 【NowCoder】牛客周赛 Round 110 F (规律与操作)
遇到操作类题目,不妨找找规律(本题规律似乎写过?本题是属于相邻操作类型题目,常见的有 max min & ^ + * ... 等,但是基本都是一个性质:区间划分,即我们可以使用操作将原数组划分为 m 个小区间对于本题,我们需要知道一个结论:对于最后的答案,我们划分的区间数一定小于等于 2。
2025-09-22 11:30:00
176
原创 【CF】Codeforces Global Round 29 (Div. 1 + Div. 2) D (博弈论)
感觉看到博弈不难想到奇偶本题我们的难点在于想到奇偶的数的决策不同对于一个数,如果其是偶数,那么对于先手,如果其取了那么后手可以跟着取,所以偶数会均分给二者而如果其是奇数,那么对于先手如果其取了,那么现在情况就变成了偶数情况,但是唯一区别就是先后手交换了,因此先手就应该去取数量最多的那个奇数,而此后这个数变成了偶数情况,那么此时这个数就会被均分给二者所以结论就是二者会去争夺数量最多的奇数,且二者的差之和这个奇数有关,因此我们只需要记录每个奇数的数量,同时每个数都均分给二者。
2025-09-21 11:44:44
332
原创 【CF】Day146——杂题 (递归 | 规律与操作)
递归看到如此巨大的 k 和 l r,显然不能暴力,因此考虑性质可以想到一种递归的方式,因为后面的字符可以从前面转移过来,而这个转移的过程就很容易想到递归,但是就是有点不好写我们定义 sum[i] 为执行到了第 i 次操作后的字符串长度,显然可以二分出第一个大于等于 k 的操作位置,然后根据这个进行转移,但是转移到哪呢?假设第一个大于等于 k 的区间是红色的操作区间,那么显然 k 的字符取决于上一次的操作区间,也就是如下图的蓝色部分。
2025-09-20 22:33:14
399
原创 【AtCoder】ABC 418 DE (同或运算 | 数学)
一个新型运算,同或类比异或,也具有结合律遇到这种操作题其实无非就是 找规律 或者 暴力+优化,本题就是找规律本题的规律就是:对于奇数长度的区间同或和,其值为区间异或和;对于偶数长度的区间同或和,其值为区间异或和取反。
2025-09-20 11:30:00
345
原创 【CF】Day145——杂题 (括号序列 + 构造 | 贪心 | 暴力 + 可行性证明 | 构造 | 构造 | 暴力)
经典trick遇到这种字符串配对,不妨想到一个trick:计算前缀和,令 ( 的权值为 1 而 ) 的权值为 -1,当 sum = 0 时,说明这一段就一定配对好了,如果 sum < 0,那么就无法配对,如果 sum > 0,就说明还需要右括号配对本题也是如此,但是多了一个 问号 条件的约束,那么如何解决问号的影响呢?还是根据上诉trick我们除了 sum,还定义一个 cnt 其代表遇到的问号数量,那么还是从左往右枚举并记录,那么就有以下几种特殊情况①.sum < 0。
2025-09-19 10:24:37
1016
原创 【CF】Codeforces Round 1051 (Div. 2) D1 (动态规划)
未曾见过的状态定义题意:给你一个数组 a,让你求其所有子序列中有多少个 “好的” 序列,定义 “好的” 序列满足:其中不存在任意最长下降子序列长度为 3 的子序列注意到数据只有 300,不难想到DP,那么如何进行状态设计和转移呢?我们可以定义 d[i] 为长度为 i 的最长下降子序列的结尾的最大值,那么对于任意一个子序列,其只可能有 d[1] d[2],且 d[1] >= d[2],所以我们可以利用这个作为状态。
2025-09-18 15:01:48
457
1
原创 【CF】Day144——杂题 (交互 + 思维 | 整除分块)
很有意思的一题注意到题目中的限制,操作次数居然乘了个 1 / 3,这其实是一种启发,在启示我们可以使用更少的操作删除更多的无用条件如果没操作次数限制,那么显然我们可以直接一个一个问,然后取最大的即可,但是现在要求变严格了,现在我们必须要在两次操作中删除三个数那么如何操作呢?我们查看相邻的四个元素,如下图我们查询 1 3,那么就有三种情况①.1 = 3。
2025-09-17 08:38:04
405
原创 【CF】D. Color with Occurrences (动态规划)
还能这样DP!?题意简单:你有 n 个字符串 s,每次操作你可以选任意一个 s,如果 t 中有子串 s,那么你可以将这个 t 中这个子串染色,求将 t 全染色的最少操作次数本题也是经典的贪心贪不明白,所以考虑DP。
2025-09-15 11:56:01
131
原创 【NowCoder】牛客周赛 Round 109 F. 小红的线下查询 (二维偏序 + 离散化树状数组)
不得不说牛客周赛确实出的越来越好了本题中题目的条件给的简洁明了,概括就是:给你 n 个点,让你求 y - x < k1 且 y + x < k2 的点的个数有多少个我们如果用图表示则为求有哪些点落在图中蓝色区域中,但是这样不利于我们求解,我们不妨将每个点进行重新映射我们定义新的节点为 (y - x,y + x) 此后为 (X,Y),那么也就是说我们就要找到 X < k1 且 Y < k2 的点,则在图上表示为。
2025-09-15 11:17:35
297
原创 【Luogu】P2613 【模板】有理数取余
方法一:注意到 MOD 是一个质数,所以利用费马小定理和快速幂求 b 的逆元即可方法二:利用 exgcd 求得 b 在模 MOD 下的逆元,然后直接 a * inv_b % MOD 即可特别的:本题数据特别大,但是注意到对 a b 取模不影响结果,所以可以转为字符串进行取模运算。
2025-09-12 11:10:56
125
原创 【CF】Day143——杂题 + ABC (数学 + 奉献法 | 随机化 | 多状态最短路)
对于一个数,首先其有固定价值 n - i + 1,即所有以 i 开头的子串,那么现在考虑 a[i-1] = a[i] 的情况,此时由于此时和前面相同,那么对于 i 前的左端点,a[i] 其实是不提供奉献的,因为此时 a[i-1] 会提前把奉献吃了,所以就有。此时如果我们选了 i 前的左端点,那么显然 a[i] 是可以提供奉献的,那么对于前面我们就能选 (i-1) 个左端点,同时我们还能选 (n-i+1) 个右端点,那么多出来的奉献就是 (i-1)*(n-i+1)如果一定更优,那么是什么情况呢?
2025-09-12 11:02:14
440
原创 【CF】Day142——Codeforces Round 1049 (Div. 2) D (奉献法)
前三题没啥说的,C和D有点像,都是奉献法修改本题中的题目,说人话:你现在有 n 个线段,你必定会选走每个线段,每个线段单独的价值为 r - l,现在你还能选中两个没被标记过的线段,并从中一个线段选出一个左端点 x,另一个线段选一个右端点 y,并新增加价值 y - x,此后这两个线段被标记,先让你求价值最大可能是多少本题分奇偶讨论,对于每次配对都要选两个没选的,所以考虑两种情况①. n 是偶数此时我们可以将所有线段配对,但是如何选择最优的配对方式呢?
2025-09-11 12:23:56
324
原创 【Luogu】P9809 [SHOI2006] 作业 Homework (根号算法)
我们不难发现本题和 mod 有关,想这种难以维护所有情况的时候,我们可以往根号算法上想本题中值域为 V = 3e5,不难发现一个特点我们可以以 B = sqrt(V) 为边界分两种方法讨论①.如果 Y <= B此时我们可以暴力枚举所有情况的答案,处理时间复杂度最多为 O(N*B),查询只需要 O(1)②.如果 Y > B此时如何处理呢?
2025-09-11 12:08:09
227
原创 String Reorder (字符串模拟)
贪心 + 大模拟注意到一个特点,当最大得到字符数量大于 n/2,那么此时就一定无法构造,否则一定可以构造所以考虑先找出最大字符以及其数量,然后进行处理假设红色部分是最大的字符所含数量,那么我们就可以这样处理,先按字典序最小的字符处理,下一次就选次小的,然后再选最小的,这样一直交替处理,直到最多的数的数量 cnt * 2 > n,此时我们就不能贪了,就必须处理这个最多的字符先(注意上诉贪心中最大字符可能会变化,因此需要时刻计算)对于最大字符也很简单,也是交替排,具体实现看代码即可。
2025-09-11 09:42:20
128
原创 Counting Towers (动态规划)
化繁为简注意到其实任意情况我们都能分成 2*n + m 的格子形式,所以考虑拆解我们定义 f[i][1/2] 为第 i 层是放了两个单个还是放了一个整个,那么分析两种情况①. f[i][1]此时上面放了一个 1*2 ,那么就是有上面的三种情况,可以发现,其可以表示为②. f[i][2]同理可以看到有以下五种情况,直接转移就有其余情况都可以用以上组合排列组合得到,同理其余情况也是如上转移。
2025-09-10 23:46:21
199
原创 【CF】Day141——杂题 (贪心 + 思维 | 构造)
考察思维的一题我们不难发现一个特点,那就是我们每次操作只会选 1 或 2 个数修改,为什么呢?对于长度任意大于等于 3 的区间我们都可以拆成 len / 2 个长度为二的小区间和 len % 2 个长度为一的小区间那么我们如何操作呢?首先最坏情况下我们肯定是每个数都操作一次,即 n 次,因此答案上界为 n,那么考虑如何缩减操作次数注意到对于一个异或和为 0 的区间,我们可以只使用 len - 1 次操作就全变为 0,具体如下。
2025-09-10 09:33:31
367
原创 【CF】Day140——杂题 (图论 + 贪心 | 二分 + 贪心 | 数学 | 动态规划)
有多种解法,这里选了一个稍微好理解的解法题目的条件给的很简单,给你 q 个限制,在确保 a[i] | a[j] = x 的限制下构造出字典序最小的数组 a显然我们可以分位考虑,因为每个位都是不影响的,那么考虑如何构造假如 a[i] | a[j] = x 中某一位是 0,那么 a[i] 和 a[j] 这一位就必须都是 0,否则如果是 1,那么二者可以任意一个这一位是 1 另一个是 0,但是当 i = j 时,a[i] 这一位就必须是 1 了。
2025-09-08 17:05:47
736
原创 【NowCoder】牛客周赛 Round 108 EF (背包问题 | SOSDP)
转换考虑到一个显然的结论,1 是有趣的,那么显然答案最少都能为 n - 1,现在考虑是否答案能否变成 n 即可如何考虑呢?我们参考背包问题的思路,我们将 sum 分为 n 个有趣的数转化为 用 n 个有趣的数能不能组成 sum所以考虑预处理出所有有趣的数,由于题目数据很小,最大有趣数不超过 100*200,所以可过最后我们 O(1) 查询即可。
2025-09-08 16:15:58
342
原创 【CF】Day139——杂题 (绝对值变换 | 异或 + 二分 | 随机数据 + 图论)
数形结合首先考虑如果没有 t 的影响该怎么写显然我们就是让最大时间最小化,那么显然选择最左端点和最右端点的中间值即可,即 (mi + mx) / 2,那么现在有了 t 该怎么办我们不妨考虑拆开绝对值,由 |a - b| = max(a-b, b-a) 可得原式 t - |x - x0| 拆解为我们令 x-t 和 t+x 为两个新点,那么显然 x-t 在 x0 左边,t+x 在 x0 右边,所以我们找到最大的右端点和最小的左端点即可,这就是我们上面的普通情况除此之外,我们可以还能使用二分or三分。
2025-09-06 09:45:09
480
原创 Array Description (动态规划)
简单DP注意到题目数据中 每个数最大值只有 100,考虑一个二维dp定义 dp[i][j] 为位置 i 为 j 的方案数,那么显然就有以下转移①. i = 1 时如果此时 x[i] 为 0,那么 dp[1][j] 全都为 1,其中 j 属于 1 ~ m否则 dp[1][x[1]] = 1②. i!= 1 时。
2025-09-05 11:57:53
197
原创 【CF】Day138——杂题 (构造 + 数学 | 分层图 + 最短路)
式子化简 + 找规律我们首先要知道,且,而 concat 这个函数无非就是在 ai 和 aj 前乘上了 100...,所以我们可以将原式化简为Z mod 3根据上诉结论,进一步化简可得将前式子拆解,得由于有一个 3,那么就可以直接消去,即最后可得所以我们观察到最后的结果只和 a[i]² 有关,不难发现,一个数的平方 mod 3 的结果只能是 0 or 1(这里假设 x 为 3*k + 0/1/2 然后平方计算即可看出),所以我们将 a[i]² mod 3 的结果进行分组。
2025-09-05 09:13:59
353
原创 【LeetCode】3312. 查询排序后的最大公约数 (枚举 + gcd容斥/容斥原理求gcd为k的数对个数 + 前缀和 + 二分)
那么现在问题变成如何求 g[i],我们只需要求出所有 i 的倍数的数量,这里记作 cnt,那么从中任意选择两个不同下标的数就有 cnt * (cnt - 1) / 2 种方法。那么根据容斥,就有 f[i] = g[i] - f[i*2] - f[i*3] + ... - f[m*i]那么我们就能知道 g[i] = f[i] + f[i*2] + f[i*3] + ... + f[m*i]我们假设求出 f[i] 的数量,其中 f[i] 代表以 i 为最大公因数的数对的数量。具体实现看代码,十分简洁。
2025-09-04 00:11:43
134
原创 【Luogu】P2398 GCD SUM (容斥原理求gcd为k的数对个数)
令 f[i] 代表以 i 为最大公因数的数对,g[k] 为满足 k | gcd(x,y) 的对数。显然 g[i] = f[i] + f[2*i] + f[3*i] + ... + f[m*i]故得 f[i] = cnt² - f[2*i] - f[3*i] - ... - f[m*i]不难看出 g[i] = cnt²,其中 cnt 代表 i 的倍数,其值为 n / i。模拟即可,复杂度约为 O(N·ln(n))
2025-09-03 23:57:15
226
原创 【LeetCode】3670. 没有公共位的整数最大乘积 (SOSDP)
那么显然问题变为如何找子集的最大值,我们可以考虑动态规划的思想,假设如果我们要找 mask 的子集最大值,那么是不是可以找 mask 所有子集的子集的最大值,以此类推,我们可以一步一步求出所有子集的最大值。我们考虑一个二进制数 mask,因为我们必须要选没有任何公共位置的数才行,那么我们参考集合论,其实就是去找 ~mask 的子集中的最大值。具体的,我们定义 f[i] 为 i 的子集中的最大值,初始化 f[x] = x(如果含有 x),然后套板子即可。
2025-09-01 22:58:36
338
原创 【LeetCode】3524. 求出数组的 X 值 I (动态规划)
但是我们发现如果按照通常枚举 f[i][j] 的 j 是不好计算的,因为 j = x * nums[i] % k,对于枚举的 j 我们不好求出转移来的 x,所以我们这里将枚举 f[i-1][j] 的 j,即反向求出转移的目的地,那么代码就是 f[i][j * nums[i] % k] += f[i-1][j]本题我们一样,我们定义 f[i][j] 是以 i 结尾,且余数为 j 的子数组的数量,那么考虑转移。①.不接上前面,由于我们可以只选自身,那么就有 f[i][nums[i] % k]++
2025-09-01 22:43:49
183
原创 Missing Coin Sum (贪心 + 数学)
题意:给定n个正整数面值的硬币,求不能通过这些硬币任意组合表示的最小正整数本题还需要一点数学知识:假设 1 ~ n 这个区间的数我们都能构造出来,那么当我们加入一个新的数 x 后(其中 x <= n+1),我们就能构造出 1 ~ n + x 的任意数了,否则如果 x > n+1,那么我们就无法构造出 n+1,我们也是利用上述数学知识解决本题的我们假设我们不能构造出 ans,那么也就是说 0 ~ ans - 1 都能构造出来,那么我们显然是从小到大选择硬币的,所以还得先排序。
2025-09-01 15:53:29
321
原创 Movie Festival (贪心)
题意简单,给你 n 个电影的起始时间和结束时间,然后求你最多能看完多少部电影我们可以先将电影按照结束时间升序排序,然后记录我们看完电影后的结束时间 endtime,初始值是 0,同时记录答案 ans,初始值也是 0接着遍历所有电影,如果某个电影的起始时间大于等于 endtime,那么我们就看这部电影,然后更新 endtime 并累加答案,否则我们就跳过这个电影贪心正确性证明:我们贪心策略为选择结束时间最早的电影,然后在剩下的 n-1 部电影中继续执行贪心策略。
2025-09-01 15:19:50
229
原创 【CF】Day137——杂题 (构造 + 位运算 | 位运算 + 思维 + 贪心 | 贪心 + 模拟 | 动态规划)
观察法这题有两种构造法,先介绍简单方法我们可以 2 3 4 5 这样两奇两偶构造,那么直接看 mod 4 的余数来讨论①.余数 = 0此时 4 个 4 个构造即可②.余数 = 1此时奇偶位一样,但是多了一个位置,我们填 0 即可③.余数 = 3此时奇数位会多一个 1,所以我们利用一个来填 1,然后按奇偶交替填即可④.余数 = 2这是最难的情况,但是题目样例中有一个 6,所以我们只需要抄样例即可,然后剩下的数一定是 4 的倍数,此时奇偶交替构造即可稍微难一点的方法在于找到性质。
2025-09-01 10:55:13
807
原创 Ferris Wheel (贪心 | 双指针)
本题注意题目的条件即可,题意说一个摩天轮可以坐一个人或者两个人,那么显然我们就可以贪心一下具体的,我们可以让最小的去匹配最大的,如果此时大于 x,那么显然我们根本无法使得 最大的那个存在两个人共坐一个摩天轮的方案,因此最大的那个就肯定要单独坐一辆,那么此时就看看次大的能不能和最小的匹配,以此类推,当能匹配时就直接跳出匹配过程即可,然后对次小值进行上诉操作即可对于上诉过程,不难发现双指针即可(代码中的 solve 为另类写法,忽视即可,主要在 solve2)
2025-08-30 23:18:09
205
原创 【CF】Day136——Codeforces Round 1046 (Div. 2) CD (动态规划 | 数学)
简单DP不难发现我们贪心是没法贪的,因此考虑DP我们令 dp[i] 为 前 i 个元素能构造出的最长整齐子序列的长度,不难发现一个很简单的转移,即直接继承 dp[i] = dp[i-1],那么现在考虑增加奉献的情况对于 a[i],如果我们此时要选择增加奉献,那么就要从前 a[i] 个位置转移,且这 a[i] 个位置 j 的 a[j] 都是 a[i]
2025-08-30 22:19:34
534
原创 Trailing Zeros (计算 1 ~ n 中质因子 p 的数量)
本题让我们求 n阶乘 后末尾 0 的个数首先我们要明白末尾 0 的个数取决于 因子 2 和因子 5 中的较小值,所以我们关键点在于如何求出二者的数量根据数学原理,我们可以分层计算某个质因子 p 在 1 ~ n 的个数,具体的,我们每次计算 n 中有多少个数是的个数,然后不断增加 k 和累加答案即可,总结就是具体实现看代码,十分简单明了。
2025-08-30 11:20:17
272
原创 Two Knights (数学)
前置知识:国际象棋中骑士的走法类比象棋的马,但是不会被棋子所阻挡首先我们不考虑限制安排两个骑士,那么一共有个格子,所以根据组合数学,那么就有种选择方式,这是显然的那么现在加上限制,现在两个骑士不能在二者的攻击范围内,由于二者是相对的,因此我们考虑其中一种情况即可,所以考虑分析其特点我们发现只有在 2*3 或 3*2 的范围中二者才有可能在攻击范围内,即以下情况。
2025-08-29 00:06:01
287
原创 【CF】Day135——杂题 (动态规划 | 二分答案 + 图论 | 动态规划 + 图论 + 贪心 | 图论 + 树的直径 + 构造)
贪心想不到时不妨考虑DP我们发现我们既可以选左又可以选右,贪心好像也没什么思路,那么就不妨考虑dp我们定义 dp[i] 为 1 ~ i 是否都能被构造出来,对于本题我们则有两种转移方式①.如果我们选择 i 当左边,那么 i ~ i + b[i] 这一段就能被构造出来,则有 dp[i + b[i]] |= dp[i-1],即继承上一层,如果上一层都构造不出来那么显然 1 ~ i + b[i] 是不可能构造出来的。
2025-08-27 11:32:22
937
原创 【CF】Day134——杂题 (思维 + 构造 + 位运算 + 二分)
挺好的题本题让你判断数组 a 的 l ~ r 区间能不能通过 x 次操作全变成 0,如果可以那么输出最少操作次数,否则输出 -1题目的操作是选取一段奇数区间,然后将区间内的数全都变成区间异或值,那么这个奇数区间就很神奇了,由于我们选取的区间是奇数,那么最后整个区间操作后其实区间异或值是没有变化的,因此找到了性质①:如果 l ~ r 区间的异或和不是 0,那么无论多少次操作都不可能变成 0,即无解同时不难发现性质②:如果 l ~ r 全都是 0,那么操作次数就是 0,这个是显然的。
2025-08-25 16:59:47
367
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人