- 博客(54)
- 资源 (1)
- 收藏
- 关注
原创 《算法竞赛进阶指南》0x05 排序-3.七夕祭
在环形均分纸牌问题中,最小移动次数等于所有前缀和到某个参考点的距离之和,而这个参考点取中位数时总和最小,这是绝对值不等式决定的。Vani 预先联系了七夕祭的负责人 zhq,希望能够通过恰当地布置会场,使得各行中 cl 感兴趣的摊点数一样多,并且各列中 cl 感兴趣的摊点数也一样多。不过 zhq 告诉 Vani,摊点已经随意布置完毕了,如果想满足 cl 的要求,唯一的调整方式就是交换两个相邻的摊点。虽然摊点种类繁多,不过 cl 只对其中的一部分摊点感兴趣,比如章鱼烧、苹果糖、棉花糖、射的屋……
2026-03-29 16:20:15
288
1
原创 《算法竞赛进阶指南》0x05 排序-2.货仓选址
本文讨论了货仓选址问题,即在数轴上选择货仓位置,使得其到所有商店的距离之和最小。通过分析少量商店的案例,发现最优解位于商店坐标的中位数处。对于奇数个商店,中位数即为最优位置;偶数个商店时,中间两个点之间的任意位置均可。数学上,这是一个绝对值求和最小化问题,中位数能确保距离和最小。算法步骤包括排序数组、定位中位数并计算距离和。注意结果可能超出32位整数范围,需用64位存储。最终时间复杂度为O(N log N),主要由排序步骤决定。
2026-03-29 16:18:33
268
原创 《算法竞赛进阶指南》0x05 排序-1.电影
本文解决了一个科学家选择电影的问题。给定n个科学家各自掌握的语言和m部电影的语音/字幕语言,需要选择一部电影使得最多科学家能听懂语音(优先),其次能看懂字幕。由于语言编号范围大(1e9),采用离散化或哈希表统计语言频率。解法一通过排序+去重实现离散化,解法二使用map直接统计。最终遍历所有电影,按照优先级规则选择最优解。两种方法均能高效处理大规模数据(n,m≤2e5)。
2026-03-29 16:16:24
216
原创 《算法竞赛进阶指南》0x04 二分-2.特殊排序
摘要: 题目要求对N个元素进行特殊排序,元素间的大小关系通过compare函数交互获取,且关系不具有传递性。需要将元素排列成每个元素都小于其右侧相邻元素的序列。通过二分查找确定每个元素的插入位置,保证最多进行10000次比较。算法从第一个元素开始,逐个插入后续元素到合适位置,最终返回满足条件的排列。数据范围N≤1000,时间复杂度为O(N²)。
2026-03-29 16:13:35
42
原创 《算法竞赛进阶指南》0x04 二分-1.最佳牛围栏
摘要:本文探讨如何求解农夫约翰农场中连续田地牛数量的最大平均值问题。给定N块田地,每块地有1到2000头牛,要求围栏至少包含F块连续田地,使得平均牛数最大。采用二分法搜索可能的平均值,结合前缀和优化验证可行性。算法复杂度为O(N log(max_value)),适用于大规模数据(N≤100000)。输入样例的解答输出为6500,展示了该方法的有效性。
2026-03-29 16:12:26
61
原创 《算法竞赛进阶指南》0x03 前缀和与差分-3.最高的牛
摘要:题目描述N头站成一排的牛,已知第P头牛最高(身高H),给出M对可以互相看见的牛(A,B)。要求计算每头牛的最大可能身高,使得互相看见的牛之间的牛都比它们矮。解题思路采用差分数组高效处理区间减操作:初始化所有牛身高为H,对每对(A,B)将区间[A+1,B-1]减1,确保中间牛比两端矮。使用map去重避免重复操作,最后通过前缀和还原身高数组。算法时间复杂度O(M log M),空间复杂度O(N+M)。
2026-02-28 10:59:16
783
原创 《算法竞赛进阶指南》0x03 前缀和与差分-2.IncDec序列
本文通过差分数组将区间加减操作转化为单点修改,从而简化问题。计算差分数组b中正数和x与负数绝对值和y,最少操作次数为max(x,y)。最终数列的可能种数为|x-y|+1,即b[1]的取值区间长度。代码使用差分数组高效求解,时间复杂度为O(n)。
2026-02-28 10:55:27
882
原创 《算法竞赛进阶指南》0x03 前缀和与差分-1.激光炸弹
题目描述了一种新型激光炸弹,需要在给定地图上找到边长为m的正方形区域,使其覆盖的目标总价值最大。通过预处理将坐标偏移后,使用二维前缀和算法优化计算效率。核心步骤包括构建前缀和数组,利用公式快速计算任意正方形区域的和,并枚举所有可能位置求最大值。时间复杂度为O(M²),其中M为地图最大坐标范围。该算法能高效处理大规模数据,适用于竞赛场景。
2026-02-28 09:25:37
731
原创 《算法竞赛进阶指南》0x02 递推与递归-7.分形之城
题目描述了一个分形城市的扩建规则:将原城市复制或旋转后放置在周围,形成更高等级的城市。每次扩建后,房屋数量变为原来的4倍($2^{2N}$座房屋)。给定城市等级$N$和两个房屋编号$S$、$D$,要求计算它们中心点之间的直线距离(每个格子边长为10米)。需要处理多组查询($T \le 10^4$,$N \le 31$)。 关键点: 分形结构具有自相似性,可通过递归处理 需要将房屋编号转换为坐标 最终距离计算要考虑格子的实际尺寸(10米) 算法需高效处理大规模查询,利用分形规律将问题分解为更小规模的子问题。
2026-02-27 20:20:07
632
原创 《算法竞赛进阶指南》0x02 递推与递归-6.约数之和
本文介绍了一个计算A^B的所有约数之和模9901的算法。首先对A进行质因数分解,得到A = P1^c1 * P2^c2 * ... * Pn^cn,则A^B的质因数形式为P1^(c1B) * P2^(c2B) * ... * Pn^(cnB)。约数之和等于各质因数等比数列和的乘积,其中每个等比数列和为1+Pi+Pi^2+...+Pi^(ciB)。通过快速幂和递归分治法高效计算等比数列和,避免了直接计算的高复杂度。算法的时间复杂度主要取决于质因数分解和快速幂运算,适用于大规模数据。
2026-02-27 19:45:22
676
原创 《算法竞赛进阶指南》0x02 递推与递归-5.奇怪的汉诺塔
本文探讨了四塔汉诺塔问题的解法。在经典三塔汉诺塔问题的基础上,通过动态规划方法计算四塔情况下移动n个圆盘的最小步数。对于三塔问题,递推公式为d[n] = 2d[n-1]+1;而四塔问题的递推公式为f[n] = min(2f[i] + d[n-i]),其中1≤i<n。算法首先计算三塔情况下的基准值,然后通过双重循环计算四塔情况的最优解,最终输出n=1到12时的最小移动次数。该方法有效解决了四塔汉诺塔问题,时间复杂度为O(n²)。
2026-02-27 19:11:43
662
原创 《算法竞赛进阶指南》0x02 递推与递归-4.费解的开关
题目要求判断在6步内能否将所有灯点亮。解题思路是枚举第一行的所有可能操作(共32种),然后根据第一行的状态依次处理后续行。对于每种枚举情况,从第二行开始,若上一行某位置为0,则必须按下当前位置来改变它。最终检查最后一行是否全为1,并记录可行解的最小步数。 核心步骤: 枚举第一行的所有可能操作(2^5种) 根据第一行状态处理后续行 检查最后一行是否全亮 在6步内找到最小操作次数 时间复杂度主要取决于枚举第一行的32种情况,每组数据最多进行32次检查,适用于给定的数据规模。
2026-02-26 16:57:36
928
原创 《算法竞赛进阶指南》0x01 位运算-5.起床困难综合症
题目摘要: 给定n扇防御门,每扇门包含一个位运算(AND/OR/XOR)和一个参数t。初始攻击力x∈[0,m]经过所有门后得到最终伤害值。求如何选择x使最终伤害最大。 解法思路: 暴力枚举所有x∈[0,m](O(nm))会超时。 优化思路:用全0和全1的二进制数预处理所有门的运算结果,分析每位变换情况: 0→1:无代价必取 1→1:有代价且temp+2^i≤m时取 从高位到低位贪心,优先保证高位收益最大化。 最终解法时间复杂度O(n),能处理n≤1e5的数据规模。
2026-02-26 11:06:27
685
原创 《算法竞赛进阶指南》0x01 位运算-4.最短Hamilton路径
本文介绍了使用状态压缩动态规划求解最短Hamilton路径的方法。给定n个点的带权无向图,要求从起点0到终点n-1经过每个点恰好一次的最短路径。由于n≤20,采用状态压缩DP,将已访问的点集表示为二进制数,定义dp[state][i]为当前访问点集state且最后停留在点i的最短路径长度。初始状态为dp[1][0]=0,通过三重循环枚举状态和转移点进行状态转移,最终输出访问所有点且到达终点的最短路径长度dp[(1<<n)-1][n-1]。该方法高效地解决了NP难问题,时间复杂度为O(n²2ⁿ)。
2026-02-26 00:02:07
851
原创 《算法竞赛进阶指南》0x01 位运算-3.64位整数乘法
摘要:AcWing 90题要求计算大整数a乘b对p取模的值,数据范围达1e18。解题采用二进制分解法,将乘法转换为加法运算避免溢出。参考代码通过位运算分解b为二进制形式,逐步累加并取模,时间复杂度O(logb)。输入样例3×4 mod 5输出2,验证了算法的正确性。
2026-02-25 23:54:05
874
原创 《算法竞赛进阶指南》0x01 位运算-2.增加模数
本文介绍了快速幂算法及其应用,通过位运算优化计算$a^b \bmod M$的过程。算法将指数$b$转换为二进制形式,通过不断平方底数$a$来减少计算次数,时间复杂度为$O(\log b)$。代码实现包含快速幂函数和主程序,处理多组测试数据,每组计算多个数对的幂和模$M$的结果。输入输出优化提升了程序效率,适用于大规模数据。
2026-02-25 23:38:33
825
原创 《算法竞赛进阶指南》0x01 位运算-1.a^b
摘要:本文介绍了快速幂算法求解a^b mod p的问题。通过将指数b分解为二进制形式,逐位计算权值并累乘,将时间复杂度优化至O(logb)。代码实现时使用循环右移处理b的二进制位,当当前位为1时将对应权值乘入结果,同时每次迭代平方权值并取模。该方法适用于大数运算(a,b≤1e9),正确处理了边界情况(如b=0时输出1 mod p)。
2026-02-25 23:29:19
839
原创 【信息学奥赛一本通】1275:【例9.19】乘积最大
摘要: 本题要求在一个长度为N的数字串中插入K个乘号,将其分成K+1部分,使得各部分乘积最大。采用动态规划解法: 预处理:计算所有连续子串的数值num[l][r]。 状态定义:dp[i][j]表示前i个数字插入j个乘号的最大乘积。 状态转移:枚举最后一个乘号位置,更新dp[i][j] = max(dp[t][j-1] * num[t+1][i])。 复杂度:时间复杂度O(N²K),空间复杂度O(N²)。代码通过三层循环实现,最终输出dp[N][K]。 示例:输入4 2 1231,输出62(分解为12*3*1
2026-02-05 19:46:59
770
原创 【信息学奥赛一本通】1296:开餐馆
摘要:该问题要求在n个有序地点中选择若干餐馆,使得任意两个餐馆之间的距离大于k,同时最大化总利润。使用动态规划解决,定义dp[i]为前i个地点的最大利润。状态转移考虑两种情况:不选当前地点则继承dp[i-1],选择当前地点则加上与之前兼容地点的利润。通过遍历寻找满足距离条件的最后一个地点pre,计算dp[i] = max(dp[i-1], p[i] + dp[pre])。最终时间复杂度O(n²),空间复杂度O(n)。
2026-02-04 20:47:19
835
原创 【信息学奥赛一本通】1292:宠物小精灵之收服
本文探讨了一个二维费用背包问题,模拟小智在精灵球和皮卡丘体力双重限制下收服野生小精灵的决策过程。通过定义dp[i][j]表示使用i个精灵球和承受j点伤害时能收服的最大精灵数,并配合ht[i][j]记录对应的最小总伤害值。采用倒序动态规划方法,确保每个小精灵只被选择一次。在状态转移时优先保证收服数量最多,数量相同时选择伤害最小的方案。最终遍历所有资源消耗组合,找出收服数量最多且伤害最小的最优解。该方法有效解决了双目标优化问题,时间复杂度为O(k·n·m),空间复杂度O(n·m),适用于给定的资源约束条件。
2026-02-04 19:36:00
879
原创 第六讲 分组背包问题
分组背包问题是0/1背包问题的扩展,每组物品最多选一个。给定N组物品和容量V的背包,每组有若干物品(体积v_ij、价值w_ij),求解在不超过背包容量的情况下能获得的最大价值。采用动态规划,状态转移方程为dp[j] = max(dp[j], dp[j-v]+w),其中j从V到0逆序遍历,确保每组只选一个物品。时间复杂度O(NVS),空间复杂度O(V)。示例输入3组物品(总体积5),输出最大价值8。
2026-02-03 19:07:33
848
原创 《算法竞赛进阶指南》0x07 贪心-5.国王游戏
国王不希望某一个大臣获得特别多的奖赏,所以他想请你帮他重新安排一下队伍的顺序,使得获得奖赏最多的大臣,所获奖赏尽可能的少。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。输出只有一行,包含一个整数,表示重新排列后的队伍中获奖赏最多的大臣所获得的金币数。,之间用一个空格隔开,分别表示每个大臣左手和右手上的整数。,之间用一个空格隔开,分别表示国王左手和右手上的整数。
2025-08-23 10:01:33
831
原创 SYZOJ部署指南2024.10.25
您正在一台从未部署过SYZOJ的服务器上部署SYZOJ网站端。如果您正在一台从未部署过SYZOJ的服务器上部署SYZOJ评测端,请确保您已经完成网站端部署指南中的步骤。或者,评测端也可被部署在不同于网站端的服务器上,请自行处理数据同步(推荐使用Syncthing。
2024-10-25 13:06:59
948
原创 第三讲 多重背包问题②——二进制优化
【题意分析】根据当前数据范围,的时间复杂度过不了,最多为。背包,那么我们需要循环。个物品的情况,比如;
2024-02-05 17:57:04
1078
1
原创 第三讲 多重背包问题①——转化
【题目来源】[AcWing 4. 多重背包问题 I](https://www.acwing.com/problem/content/4/)当有一种物品的个数,多于或等于背包完全装该种物品的数量时,此时相当于完全背包,即。【题意分析】和完全背包问题类似,但是区别在于每一种物品的数量是有限的。因为每一种物品数量有限,所以将每个物品看作单独的种类,可转化为。
2024-02-05 16:30:39
1040
原创 第二讲 完全背包问题
【题目来源】[AcWing 3. 完全背包问题](https://www.acwing.com/problem/content/3/),即上一行同一列或同一行前列,数组前面的值会发生改变并且决定后面的值,所以应该从前往后遍历。背包的唯一区别在于,每一个物品变为了每一种物品且都有无数件,可以重复装入。种物品可装入,但是我不知道现在想要装入的这前。种物品已经装入了几个,所以考虑空间为。要注意,此时的状态转移方程会发生改变。亦可解释为,当背包空间为。种物品的装入情况,即。
2024-02-05 15:35:38
807
原创 第一讲 0/1背包问题
优化:我们发现dp[i][j]的值取决于dp[i - 1][j]或dp[i - 1][j - q[i].v],即上一行同一列或上一行前列,因此可将二维数组dp[i][j]优化为dp[j],要注意的是数组后面的值取决于前面的值,所以应该从后往前遍历。②装入第 i 个物品,要求当前的背包空间不小于q[i].v,dp[i - 1][j - q[i].v] + q[i].w;最后答案即为,当背包空间为 V 时,我面前有前 n 个物品,能够装入的最大价值。①不装入第 i 个物品,dp[i - 1][j];
2024-02-05 12:58:28
943
原创 洛谷P2234 [HNOI2002] 营业额统计
由于节假日,大减价或者是其他情况的时候,营业额会出现一定的波动,当然一定的波动是能够接受的,但是在某些时候营业额突变得很高或是很低,这就证明公司此时的经营状况出现了问题。第一行为正整数 n(n≤32767) ,表示该公司从成立一直到现在的天数,接下来的 n 行每行有一个整数 ai(∣ai∣≤106) ,表示第 i 天公司的营业额,可能存在负数。结果说明:5+∣1−5∣+∣2−1∣+∣5−5∣+∣4−5∣+∣6−5∣=5+4+1+0+1+1=12。特别地,第一天的最小波动值为第一天的营业额。
2023-11-16 10:24:39
188
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅