- 博客(34)
- 问答 (2)
- 收藏
- 关注
原创 拓扑排序判断环 && P1347 排序题解
然后,输出 C ,再输出 D ,最后输出 E ,完成拓扑排序。看我刚说的三种情况,我们如果以每一个元素看作一个节点,每条关系看作一个边,那么有解的情况对应的就是有稳定的顺序,无法确定就是没办法输出结果,矛盾的情况就是有环;题目说的意思是,给定m组关系,当你判断是否可以确定这n个元素的大小关系,如果可以的话,就直接输出,不行分为两种,一种是不能确定关系,另一种是有矛盾。在一次拓扑完了过后,如果说队列里同时有两个点,及比如上边的B,C都是入度为0,就代表我们有两种选择,也就是无论如何也不可能是唯一的序列。
2025-08-20 20:36:14
156
原创 次短路&&P2865 [USACO06NOV] Roadblocks G题解
如果当前最短路,也就是d[y]大于当前距离,就用之前的最短路去更新当前次短路,同时用当前距离去更新最短路。如果当前的举例大于最短路,也就是d[y],但是小于当前次短路sd[y],就用当前距离更新sd[y]。首先,我们在用d数组记录最短路之外,还需要另一个数组sd来记录到节点i的次短路。可以知道我们由d[i]表示到节点i的最短距离,遍历每一个节点来更新。上一篇讲了怎么找最短路,这一片讲一下怎么求次短路和怎么实现。先来看原版dijkstra求最短路。
2025-08-20 19:54:28
148
原创 差分约束系统&&SPFA判负环
差分约束系统是通过将不等式转化为有向图边来求解的算法。将不等式x_j - x_i ≤ c转化为从i到j、权为c的边,利用SPFA求最短路时,松弛操作dist[j] ≤ dist[i] + c与不等式约束x_j ≤ x_i + c完全对应。若图中存在负环,则说明约束条件矛盾无解。解题时需建立超级源点确保连通性,并通过节点入队次数判断负环。典型例题如洛谷P5960模板题和P1993农场问题,通过建边和SPFA判负环即可求解。
2025-08-19 21:04:11
759
原创 最短路spfa和多层图(P1073 [NOIP 2009 提高组] 最优贸易)题解
本文提出了一种分层图建模方法解决最优贸易问题。通过构建三层图:第一层表示买入状态(边权为负点权),第二层表示持有状态(边权为0),第三层表示卖出状态(边权为正点权)。使用SPFA算法求最长路径,因为存在负权边和环。最终结果取第三层终点的最大值,若为负则输出0。该方法巧妙地将点权转化为边权,通过分层图处理交易顺序问题,有效解决了在无向图中寻找最优买卖点的问题。
2025-08-18 20:58:10
189
原创 Dijkstra和多层图 0
本文介绍了Dijkstra算法在多层图中的应用,通过两个例题展示了如何处理带有限制条件的最短路径问题: 使用堆优化Dijkstra算法模板,通过建立多层图来处理有k次免费机会的路径问题。每层代表使用不同次数的免费权限,通过层间边权为0的边表示免费转移。 在洛谷P4568和P1948两道题目中,详细展示了如何构建多层图结构,并修改Dijkstra算法来求解在k次免费条件下的最优解。 特别强调了数组大小设置的重要性,指出这是调试过程中的常见问题点。 文章通过清晰的代码实现和分层图的概念解释,帮助读者理解如何在复
2025-08-18 20:28:59
712
原创 线段树例题
该文介绍了使用线段树和扫描线算法计算矩形面积并的解法。首先对矩形边界进行离散化处理,将每个矩形转化为两条垂直于x轴的扫描线(入边和出边)。利用线段树高效维护y轴方向被覆盖的总长度,通过扫描线从左到右移动计算相邻扫描线间的面积贡献。线段树节点存储区间覆盖次数和有效长度,通过pushup和update操作动态更新覆盖状态。最终将各段面积累加得到总面积,时间复杂度为O(n log n),适用于大规模数据。
2025-07-23 16:06:05
883
原创 线段树的基础和实现
线段树是一种高效处理区间查询与修改的数据结构。文章介绍了线段树的基本操作,包括建树、查询区间最大值和区间修改。通过递归构建二叉树结构,每个节点存储区间信息,使用pushup维护节点值。查询时通过比较区间范围逐步缩小搜索范围。对于区间修改,引入懒标记技术实现延迟更新,仅在必要时传递标记,将时间复杂度优化为O(logn)。最后给出了两个模板题的代码实现,分别是静态区间最大值查询和动态区间加减与求和。
2025-07-23 09:41:49
792
原创 马拉车(Manacher)算法
马拉车算法是一种用于高效求解最长回文子串的线性时间算法。它通过预处理将字符串统一为奇数长度,利用回文对称性减少重复计算。算法核心包括:预处理(插入特殊字符统一奇偶情况)、中心扩展(利用已知回文信息优化计算)和边界维护。相比传统O(n²)的中心扩展法,马拉车算法将时间复杂度优化至O(n),在处理大规模字符串时更具优势。示例代码展示了如何实现该算法,包括预处理、回文半径计算和结果输出等关键步骤。
2025-07-19 15:49:06
295
原创 数据结构——单调栈
单调栈是一种特殊的栈数据结构,它的特点是栈内的元素始终保持着某种单调性(递增或递减)。这种数据结构在解决一些数组相关的问题时非常高效,特别是涉及到 "下一个更大元素"、"上一个更小元素" 等场景。
2025-07-18 15:52:34
843
原创 二进制枚举
在计算机科学中,(Binary Enumeration)是一种通过二进制数的位组合来枚举所有可能状态的算法技巧。它常用于解决组合优化、子集生成、状态压缩等问题。对于一个包含n个元素的集合,其所有子集的数量为(每个元素可以选择「包含」或「不包含」)。而一个n位的二进制数恰好有种不同的状态,每一位可以表示集合中对应元素的取舍。因此,可以用二进制数的每一种状态来表示集合的一个子集。
2025-07-16 19:04:18
845
原创 ST算法和ST表
,所以我们可以通过在输入数列a时进行一次预处理,将数列分为n个小段,对于每一个小段求出最大值(有点像最优子结构的意思),最后合并成原来的数列。先设f[i][j]表示数列a中从i开始的2^j个数的最大值,其中f[i][0]=a[i],因为f[i][0]表示a[i]到a[i]间的最大值。即从=以f[i][j] 为分界线,将他左边分成一段,再把他的右边分成一段.首先确定dp边界,就上上面说的f[i][0]的最大值就是a[i]。比如[1,3]=max([1,2],[2,3])f[i][j-1]的i表示i为起点,
2025-07-16 17:00:34
1358
原创 贪心&&贪心的反悔
本文介绍了贪心算法的基本概念与应用场景。贪心算法通过局部最优选择逐步构建全局最优解,适用于具有最优子结构且选择不影响后续决策的问题。文章通过找零钱、课程选择等示例说明贪心策略的适用性,并指出其局限性(如需要"反悔"机制的情况)。以洛谷P3620题为例,详细解析了带反悔功能的贪心算法实现:通过优先队列选择最小距离,同时计算"反悔值"(左右邻居距离和减当前值)来实现动态调整。这种设计允许算法在后续步骤中自动修正之前的选择,从而获得更优解。文章最后强调,当反悔值更优时会自然
2025-07-15 20:38:35
746
原创 离散化+二分答案
来看一道题盖云一个平面里有很多个点,每个点表示一个三叶草。而需要在平面上圈出一块正方形的地方,使里面至少有题目里要求的数量的三叶草,并且边长尽可能的短。
2025-07-15 15:18:11
1092
原创 快速幂&&快速乘
快速幂是一种高效计算整数幂的算法,通过将指数分解为二进制形式,利用幂运算性质减少乘法次数,时间复杂度从O(b)优化到O(logb)。算法核心是在循环中将结果与当前幂次相乘,并通过平方操作为下次迭代做准备。类似思想也可用于快速乘,将乘法转换为加法操作。这两种算法都利用了二进制分解的思想,大幅提升了计算效率,特别适用于大数运算和模运算场景。
2025-07-12 07:58:11
262
原创 CSP模板
本文整理了常用算法和数据结构模板,包括输入输出优化、快速幂、离散化、二分答案、Manacher算法、前缀和/差分、链式前向星等基础算法实现;Dijkstra堆优化、SPFA、归并排序、欧拉筛等经典算法;以及单调栈、字典树、链表等数据结构实现。每个模板都提供了核心代码和简要注释,涵盖了算法竞赛中的高频考点和实用技巧,可作为快速查阅的代码手册。
2024-10-25 00:03:28
308
原创 动态规划——背包问题(01背包、完全背包,分组背包与二进制优化)
其常见的问题形式为:给出n个物品,每个物品有对应的价值和体积。给出背包容量后求不超过背包容量的条件下能获得物品的价值总和的最大/最小值定义一个二维数组,dp[i][j] 表示在考虑前i个物品,且背包容量为j的情况下,能够获得的最大价值。那么,我们就能得到如下的状态转移方程:首先,对于每个物品,我们都有选和不选两种选择其中,dp[i-1][j]表示不选择第i个物品,dp[i][j-volume[i]]+value[i]表示选择第i个物品。这两者之中我们取值较大的那个。cin>>v>>m;
2024-08-14 21:04:17
2045
2
原创 哈夫曼编码(哈夫曼树)
哈夫曼编码(Huffman Coding),又称霍夫曼编码,是一种广泛应用的编码方式,属于可变字长编码(VLC)的一种。该编码方法由David.A.Huffman在1952年提出,其核心思想是完全依据字符出现的概率来构造异字头的平均长度最短的码字,这种编码方式有时被称为最佳编码。比如,题目中询问的d对应的数据为30,从30向上遍历到根节点就能得到编码长度为2.(本蒟蒻当时还不会哈夫曼编码)
2024-08-13 20:49:37
652
原创 结构体(struct)、联合体(union)和类(class)
封装是指将对象的属性和操作这些属性的方法(或称为函数)捆绑在一起,形成一个独立的单元,即类。在封装的过程中,对象的内部实现细节被隐藏起来,只对外公开类的公有成员,从而控制对对象属性的访问和修改。这样做的目的是保护对象的数据不被随意修改,同时保证对象的使用者只需通过公开的接口与对象交互,而无需关心对象内部的实现细节。继承是面向对象编程中的一个重要特性,它允许一个新的类(子类)继承一个已存在的类(父类)的属性和方法。联合体的大小是其最大成员的大小,因为联合体中的所有成员都共享相同的内存空间。
2024-08-13 20:28:25
707
原创 链表——双向链表
删除第k个节点node *p;p=head;i<=q;delete p;注意这里除了改前后节点的前驱后继之外,还要delete当前的节点确保真正的删除。
2024-08-12 22:50:54
354
原创 数学——排列组合总结和归纳
最后,对于每一种选择(就是选哪个数来考虑),我们都有D(n-1)+D(n-2)种错排方式。(错排)将数字1,2,3,4填入标号为1,2,3,4的四个方格里,每格填一个数,则每个方格的标号与所填数字均不相同的填法有()2.A,B,C,D,E五人并排站成一排,如果B必须站在A的右边(A,B可以不相邻)那么不同的排法种数是()1.A,B,C,D,E五人并排站成一排,如果A,B必须相邻且B在A的右边,那么不同的排法种数有()由数字0,1,2,3,4,5组成没有重复数字的六位数,其中个位数字小于十位数字的共有()
2024-08-11 21:57:02
1098
原创 数学——排列组合2
定序问题使用缩倍法(插空法),通过减少排列的种类来简化问题。多排问题使用单排法,通过将多排问题转化为单排问题来简化计算。圆排问题也使用单排法,将圆上的排列问题转化为直线上的排列问题。可重复的排列使用求幂法,通过计算重复元素的排列数来得到总排列数。有序分配问题使用逐分法,按照一定的顺序进行分配。1. 相邻问题使用捆绑法,先将相邻的元素“小排列”,然后将其“捆绑”起来看做一个整体,再与其他元素进行“大排列”,即“先小排列,后大排列”。四个不同球放入编号为1,2,3,4的四个盒中,则恰有一个空盒的放法有多少种?
2024-08-11 20:04:26
238
原创 数学——排列组合
(错排)将数字1,2,3,4填入标号为1,2,3,4的四个方格里,每格填一个数,则每个方格的标号与所填数字均不相同的填法有()3.A,B,C,D,E五人并排站成一排,如果B必须站在A的右边(A,B可以不相邻)那么不同的排法种数是()1.A,B,C,D,E五人并排站成一排,如果A,B必须相邻且B在A的右边,那么不同的排法种数有()由数字0,1,2,3,4,5组成没有重复数字的六位数,其中个位数字小于十位数字的共有。A在第一排,就有4种,B在A后面有4种,C在最后的最后有4种,其余位置为5的全排列。
2024-08-10 17:22:32
713
2
原创 图论——拓扑排序
在CSP初赛基本信息(书接上回)这篇文章中,就已经对拓补排序做了一个概念性的解释(做诠释),但是本蒟蒻昨天写一个拓补排序的模板写了很久,所以写这一篇来记录一下拓补排序
2024-08-10 10:46:16
1665
1
原创 CSP 2020 入门级第一轮重要题目
两个人非要一起站,就可以把这两个人看成一个人,用排列,A44计算得到4*3*2*1得到24中可能,但是站在一起的两个人之间还有A12种可能,一共就是A44*A21种就是24*2=48种。另外一列也是一样的,为15+1到15到1的和。做加法的那一列会从15+14开始,每迭代一次都加上前一个,直到加到一,最后加法部分的结果就是15的2次方一直加到1的二次方(2.若输入的 nn 为 15,接下来的输入是 15 到 11,以及 15 到 11,则输出为( )。将所选区间的右端点更新到新选择的区间的右端点。
2024-08-09 23:32:24
601
原创 CSP初赛基本信息(书接上回)
接着,选择 B 输出,删除 B 及其相关的边,此时 D 的入度变为 0。如果一个程序的语句执行次数为2n^3+3n^2+n+7,那么这个程序的渐进时间复杂度为O(n^3)。它的主要思想是:对于一个有向无环图,选择一个入度为 0 的顶点并将其输出,然后删除该顶点以及与其相关的边,重复这个过程,直到图中所有顶点都被输出。另外,大数组必须开全局变量。2、对于一棵满二叉树来讲,它的层数(深度)为k,则它的节点总数为2k-1。那么,在执行的时候是从3开始判断是否为真,然后执行某一个表达式,依次向上回溯。
2024-08-09 17:18:26
1238
原创 CSP-J 2020 第一题 优秀的拆分
我们就可以很开心的直接生成一个等比数列,从2的一次方列举到2的30次方,然后从2的30次方到这循环到2的1次方,用输入的n来判断是不是比当前遍历到的值大,如果大,就输出当前的值,并且用n减掉。不然就一直循环直到遍历完整个等比数列。首先,如果你很很熟悉十进制传二进制的代码,那么这道题对你而言就十分简单。但也不是说不会十进制传二进制,这道题我就做不来。首先明确一点,就是奇数肯定不是优秀的拆分。因为奇数绝对会拆出来2的0次方,那么我们。你可以发现他的本质其实就是转成二进制,然后从大到小输出每一位。
2024-08-08 22:04:48
647
原创 CSP初赛基本信息
其实,它是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。输入设备是计算机的重要组成部分,输入设备与输出设备合称为外部设备,简称外设,输入设备的作用是将程序、原始数据、文字、字符、控制命令或现场采集的数据等信息输入到计算机。关于位运算的相关知识请有兴趣的同学自己学习。是整个计算机的中枢神经,其功能是对程序规定的控制信息进行解释,根据其要求进行控制,调度程序、数据、地址,协调计算机各部分工作及内存与外设的访问等。
2024-08-08 17:30:08
1247
原创 C++数据排序
首先我们需要一个返回值为布尔(bool)的函数,这个函数返回你想要的排序规则 ,举个例子return a>b;return 0;以上程序的运行结果为6531,可以看到经过对排序规则的自定义,成功的改变了他的排序顺序。return a>b表示排序的顺序为前面的数大于后面的数,也就是由大到小排列,降序我们来做一道题模拟一下:给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。输入:第一行为n (0 < n < 20),表示班里的学生数目;
2024-02-01 00:39:29
446
1
一款用Python开发的系统工具,方便对电脑的操作 因为没有数字签名,可能会被杀软报毒,请忽略
2023-02-01
一款管理pip的图形化软件
2023-02-01
Python如何列表相减且不去重?
2023-08-07
pygame库打包问题
2022-04-20
TA创建的收藏夹 TA关注的收藏夹
TA关注的人