- 博客(140)
- 收藏
- 关注
原创 P4145 上帝造题的七分钟 2 / 花神游历各国[线段树 区间开方(剪枝) + 区间求和]
时间限制: 1.00s 内存限制: 125.00MB。
2026-01-09 13:26:56
138
原创 P6492 [COCI 2010/2011 #6] STEP [线段树 单点取反 最大子段变种]
时间限制: 1.00s 内存限制: 512.00MB。
2026-01-08 16:23:07
129
原创 牛客每日一题
如果(a,b,c)是一条线并且点a和点c之间也有边的话,我们称(a,b,c)构成一个三角,同理我们视由这三个点组成的三角为同一个三角,即(a, b, c)、(a, c, b)、(b, a, c)、(b, c, a)、(c, a, b)、(c, b, a)只能被算一次。给出一张N个点M条边的图,假设图中有三个节点分别为a,b,c,若点a和点b之间有边并且b和c之间有边的话,我们就称(a,b,c)为一条线,同时视(c,b,a)和(a,b,c)为同一条线,而对于其他的组合则认为是和(a,b,c)不同的线。
2026-01-06 09:08:44
405
原创 CF 104287F 数论[gcd lcm 裴蜀定理]
首先,根据裴蜀定理,可以找到一个系数,使得 kVmodc=gcd(V,c) ,而无论如何取模结果显然都是 gcd(V,c) 的倍数( x 的倍数关于另一个 x 的倍数取模,结果是 x 的倍数,否则有矛盾),所以可取的数值就是 gcd(V,c) 的若干倍。因此最大结果就是 (c/gcd(V,c)−1)×gcd(V,c)=c−gcd(V,c)。先求一下a,b 的最小公倍数lcm d一定是这个数字的倍数 也就是k*lcm。一个数字的倍数关于另一个数字取模的结果。时间复杂度为 O(logM)。
2026-01-05 10:35:10
201
原创 CF1282B2
例如,如果商店现在有 n=5 件商品,价值分别为 a1=2,a2=4,a3=3,a4=5,a5=7 和 k=2 ,而瓦夏有 6 个硬币,那么他可以购买 3 件商品。每个测试用例的第一行包含三个整数 n,p,k ( 2≤n≤2⋅105 , 1≤p≤2⋅109 , 2≤k≤n )--商店中的商品数量、瓦夏拥有的硬币数量以及以最贵商品的价格可以购买的商品数量。否则,最后 k 个物品的总花费等于最贵的物品的价格,剩余的 m−k 个物品成本之前已经算过了。瓦夏决定抓住这个机会,用自己的钱为朋友们购买尽可能多的商品。
2025-12-31 13:20:56
395
原创 CF 1498C [DP]
粒子可以直接穿过平面,但是,每个平面都会产生一个与粒子方向相反、衰变年龄为 k−1 的相同副本。例如,如果有两个平面,一个粒子的衰变年龄为 3 (朝右),则过程如下:(这里, D(x) 指的是衰变年龄为 x 的单个粒子)总之,最终的粒子多集合 S 是 {D(3),D(2),D(2),D(1)}。我们定义dp[i][j] 为 能量为i的粒子 前面有j个板子 能产生的粒子 那么穿过一次板子后 分裂为两个粒子。那么有: dp[i][j]=dp[i][j-1]+dp[i-1][n-j];
2025-12-31 11:08:31
236
原创 CF105930e
首先 进行k次操作后 数组的总和是tot+k tot 为原来的数组的和 设最大公约数为x 那么数组的每一项都是x的倍数 那么 所有数组累加后 也应该是x的倍数 那么x就是tot+k的一个约数 我们只需要逐一检验他的约数 然后取最大的即可。cnt数组统计小于等于当前数字的数目 那么我们就可以用类似于前缀和的思想 统计0~x x+1~2x 等区间的数字的个数 然后将他们替换大于等于他们的最小的x的倍数 然后求和判断是否和法。反之 我们就找到大于等于当前数的最小的x的倍数即可。
2025-12-31 10:14:35
237
原创 CF GYM106049 G [构造][数论]
对于一个长度为v的数组 他的乘积为num1(num1+1)(num1+2)....(num1+v-1) 这个乘积一定是v!的倍数 我们可以利用组合数证明 设组合数c(num1+v-1,v) 即num1(num1+1)(num1+2)....(num1+v-1)/v!组合数是整数 所以分母一定是分子的乘积 那么就一定是倍数。求所有区间的公约数 等价于 求所有区间长度的阶乘的最大公约数 也等价于求最小区间长度的公约数 那么我们只需要构造出一个最小的区间即可。
2025-12-30 19:53:04
179
原创 codefoeces EDU186 D[组合数学] E[贪心]
我们每一个人分配给刚好能用礼盒解决的最小礼盒 如果没有那么就分配给结尾 也就是m+1 这样每个人只会被分配一次 然后我们从小到大遍历每个气球 然后将这个气球能解决的所有的花销都放入集合中 这样以来 由于升序 任何一个当前放出的气球 都可以解决当前集合中的所有人的 花销 那么我们选择一个最大的即可 这样的收益最大 处理完每个气球后 我们再考虑花钱即可。第一次全排列 b个位置中出c个人即可 剩下的全排列把剩余位置全部占领即可。1.最多的人的盒子内的个数不超过sum/n+1。
2025-12-30 17:00:36
163
原创 ABC round 438 E st倍增
我们设st[i][j]表示i 拿到水桶后 经过1<<j时间 水桶传递给谁 sum[i][j] 表示从i拿到某个水桶后 1<<j这个时间后 水桶的增加量 然后进行查询即可。有 N 人和 N 桶。人和水桶的编号都是 1,2,…最初,人 i 只持有水桶 i ,而水桶 i 是空的。对于 i=1,2,…在这里,水桶中的水量没有限制。
2025-12-28 15:15:59
316
原创 倍增 ST表
a b区间可能但是能通过a区间的答案 b区间的答案 加工出来 那么这种问题就是一个但是 区间求和 显然是不可以的再例如ST表都能高效解决;优劣:RMQ问题可以用st表维护 也可以用线段树优势:时间复杂度 nlogn 单次查询o(1)代码量好写劣势: 所需要的空间比较大维护的信息有限不支持修改操作。
2025-12-28 13:20:22
527
原创 牛客小白月赛 D[差分] E [暴力枚举] F[] g[二阶差分]
这道题有个结论 当点位于两点所构成的矩形内 那么他到两点的曼哈顿距离之和永远相等等于矩形的长+宽 如果在矩形之外 那么到两点的曼哈顿距离和(记作K)相等的点有2*K个。直接暴力会tle 我们可以算出每个曲目的舒适区间 可以合并就合并 然后用差分 维护每个值下舒适区间的数目 总数减去舒适的数目就是不舒适的数目;红色部分 四个角落为孤立的点 一个单位长度为一个点 点的个数和这个直角三角形的边长相等。距离不同 产生的不舒适感线性增长 我们可以用差分的差分进行维护。
2025-12-27 00:50:21
210
原创 CF 2170 C [贪心][二分]
同时,由于这两对存在,这意味着 (q1+1)(ry+1)−1≤k 和 (qx+1)(rc+1)−1≤k。所以我们要找一段 使得这一段倒序配对都可以满足小于k 否则我们就找更小的一段 我们选择整个数组的前c个q和整个数组的后c个r配对 所得到的结果一定不会比 选择整个数组的前c个 令这c个之间大小配对更好 因为这样得到的乘积会更小 更有可能出现最优解;2≤k≤1018 )--数组 q 和 r 的大小,以及 x 和 y 的上限。计算在给定的数组 q 和 r 中可以执行的最大操作数。
2025-12-26 17:17:43
834
原创 CF788A DP
这里,我们先设 bi=|ai−ai+1| ,那么我们所求变为 ai 无关,接下来我们只考虑数组 bi ,看这个变量如何求出最值。故 dp2[i+1] 用 dp1[i]−bi+1 更新。故 dp1[i+1] 用 dp2[i]+bi+1 更新。首先 题目中的|a[i]-a[i+1]|本身并没有意义 我们可以把它看作一个数组b 然后看看题目让我们求什么。我们设置长度为奇数/偶数 以i结尾的子段的最大值是dp1[i]/dp2[i];原式=bl−bl+1+bl+2−⋯+(−1)r−1−lbr−1。
2025-12-26 14:39:46
783
原创 算法竞赛进阶指南 动态规划 背包
01背包的基本模型: n个物品 第i个物品的体积为vi 价值为wi 有一个容积为m的背包 要求选择一次额物品进入背包 使得不超过背包容量的物品总价值最大01背包明显的特点就是一个物品只能选择一次我们可以用已经处理了的物品数目和当前的的体积作为阶段 f[i,j]表示前i个物品中体积为j的最大价值的选法的价值 那么有f[i,j]=max{f[i-1,j],f[i-1,j-vi]+wi} 初始状态f[0,0]=0 其余初始化为负无穷 因为目标是最大价值 目标:max{f[n][m]};
2025-12-24 23:25:26
891
原创 CF GYM105316A DP
我们要让每一条边都小于当前总边权的一半 对于每种组成的最后一条边 他的边权一定是sum[j+1,i] i为最后一条边的终点 j+1为最后一条边的起点 那么这条边也要满足小于总边权的一半 对于每一个最后一条边的合法起点 他前面的部分也一定是合法的 那么每找到一条这样的合法的最后一条边 他的方案数就增加dp[j] 那么也就是所有合法情况的前部分的前缀和。也就是已经有的分法 加一条合法边 我们枚举所有可能的合法新增边 那么其余的部分的分法直接调用 然后对他们累加。输出 109+7 的模数。
2025-12-24 18:51:39
266
原创 CF1207C DP
考虑到第 i 个位置为止,且当前高度为 1/2 的最小成本为 dp[i][1/2] ,只需枚举新的位置的高度,进行状态转移即可。立柱的高度等于新位置的高度,管道长度等于横着的(固定为 1 )加上竖着的(如果高度变化则需要 1 的竖管)。注意第一个位置和最后一个位置只能是 1。由于后面的状态只与前面有关 所以只需要一个变量覆盖就可以 不需要数组。当我们直到了第i个位置的成本 那么就可以推导出第i+1 个位置的成本。一个状态如果不可抵达 那么就定义为极大值。我们要注意的信息有第i个位置的高度。
2025-12-24 16:19:29
205
原创 Codeforces Round 1071 (Div. 3) D位运算
根据题目 我们要保证1 的位数尽可能满的减小 并且有效的1的位数相同的时候 保证这几个有效位相同的数字从小到大排列。我们可以取反后用lowbit 进行排序 或者直接位运算纯模拟。
2025-12-24 10:02:26
184
原创 CF 566F [dp]
这道题题意大概是在一堆数字中找到一个集合 使得这个集合中两两可以整除 也就是对于一个集合{a1,a2,a3...ai....an} 有两两可以整除 但是如果我们排好序后 只需要满足相邻两项可以整除 因为更前面的都是因子。那么如何找到最大的集合呢?我们可以使用dp 假设我们目前找到的以x为最大元素的集合至多有k个元素则下一个元素可能是2*x 3*x . ...... 我们枚举下一个可能的元素即可。
2025-12-23 16:42:17
165
原创 算法竞赛进阶指南 动态规划 线性dp
动态规划 和搜索一样 需要我们处理问题与状态空间对于搜索来讲 我们要考虑初态 边界 所有可能搜到的点 要考虑一下步骤1.定义状态(存什么+哪些是参数+哪些是局部变量)2.推导(怎么从一个状态搜到下一个状态)而动态规划在此基础上要加上一点 简化状态 用尽可能少的值表示状态也就是:1.定义状态(存什么+哪些是参数+哪些是局部变量)2简化状态 (用尽可能少的值表示状态)3.推导(怎么从一个状态搜到下一个状态)总流程就是问题(形式化)
2025-12-23 16:41:58
861
原创 牛客周赛round123 G小红出千[补题][滑动窗口]
根据题目 我们要选择一个长度为n的区间 令这个区间内的不重复数字最多 这一过程可以使用滑动窗口实现。
2025-12-22 16:30:52
167
原创 ABC437 E SortArrays [trie + map字典序]
通过阅读题意 我们可以得到 一个序列ai 是ax 后面加一个y实现的 那么我们可以将每一个a看做一个trie树的节点 然后trie的节点之间的权值看作y 通过map自动排序字典序 实现字典序的从小到大的输出。,AN 按词典顺序排列时(当有多个相等的序列时,先排列指数较小的序列), P 是出现在该排列中的指数序列。dfs输出的时候 输出当前序列的相同的序列 然后遍历自己的下一节的序列输出 实现了 先考虑长度 再map 实现字典序输出。,N) 的排列 P=(P1,P2,…
2025-12-21 16:11:22
445
原创 [模板]st表 RMQ区间最值问题
查询区间[l,r]的最值的时候 我们先计算一个k满足2^k<=r-l+1<2^(k+1) 也就是2的k次幂小于区间长度下 然后比较以l开头的2^k个数的区间中的最大值 和 r结尾的2^k个数字的区间的最大值 因为求的是最值 所以这两个区间可以重叠 但是必须包含所有的元素。设f[i][j]表示数列中子区间[i][i+2^j-1]中的最大值 也就是包括i本身 一段长度为2^j的区间最大值 递推边界显然是f[i][0]=a[i] 也就是[i,i]区间中的最大值是本身;st表基于倍增的思想实现。
2025-12-14 11:19:04
153
原创 算法竞赛进阶指南 进阶搜索
深度优先遍历就是在每个点的多个分支中选择一条边走下去执行递归直到回溯到x之后 再考虑走其他的边深度优先遍历代码如下:静态数组邻接表:vector邻接表的dfs:树的dfs序一般来说我们在递归的时候以及回溯的时候分别记录一下节点的编号那么产生的序列就是树的dfs序 树的dfs序有以下特点 :两个相同的序号中间部分就是以这个编号为根的树的dfs序其中包含了他的各个子树的序代码:树的深度(自顶向下)树的深度是一种自顶向下的信息 若树的根节点的深度为0 那么他的子节点的深度为1 以此类
2025-12-11 09:58:55
875
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅