- 博客(62)
- 收藏
- 关注
原创 【DP】背包问题全解
其实就是多了一维,和一维费用没啥区别二维背包可以结合上述所有背包!1.只有完全是正序遍历的,其他背包都是倒序遍历!2.DP核心就在于熟练掌握闫氏DP分析法和题刷多了,积累了足够多的状态转移方程。3.其实背包问题并不难,待到题刷够了,一切就迎刃而解了!加油!!!
2023-11-13 16:05:58 354
原创 【DP】最长上升公共子序列
这道题易知是最长上升子序列(LIS)和最长公共子序列(LCS)的综合应用。我们可以先求最长公共子序列,然后再内循环最长上升子序列即可,直接看代码。因为这层循环是在16行代码的基础下进行的。这样的话我们可以再等价把内层循环优化掉。
2023-11-02 23:22:31 175
原创 【真题T1】[NOIP2021] 报数
既然题目说7以及带7的十进制的倍数不能报。那我们提前预处理,把这些数标记一下就可以了。在过程中我们顺带记录一下,每个数的数组指向下一个成立的数。
2023-10-17 09:47:39 300
原创 【真题T1】[NOIP2022] 种花
我们可以看出,枚举列的循环显然是无法优化的。但我们枚举了两次行,即x1,x2。我们只枚举x2即可。计算每一列的前缀和,就在“C“型的基础上,再乘以x2的列前缀和,即x2以下还有几个格子。A:因为后者直接覆盖前者了。当然其中有一处和前者有联系。我们发现,在枚举x2时,只需要x2*sum即可。sum就是x1的累加。Q:多测,这里为什么没有清空数组。
2023-10-16 15:02:36 357
原创 【专题】并查集判断冲突
即存在一条不相等的约束条件,对于它约束的两个变量,如果在一个集合里面,那就不可能满足!如不相等的约束条件都满足,那就YES。t很大,fa数组根本存不下,但n可以存下呀,fa开了许多用不到的空间。这是我们可以想到用离散化,fa我们不开数字大小,而是开够有多少数字即可。因为数组下标从1开始,函数调用要注意,该加1要加1,该减1要减1!,我们只要把它约束的两个变量放在同一个集合里面即可。在离散化后fa和book数组要开n的二倍哦!因为有x和y两个数据!数量规模都扩大了二倍。最后把数字离散化为它排第几就可以了。
2023-10-13 11:18:15 80
原创 【数据结构】点分治
点分治(Centroid Decomposition)是一种树分治的技术,主要用于解决树上路径问题。在树结构中,点分治的目标是将原树分解为若干棵子树,使得每个子树的大小都不超过原树大小的一半。这样的分解可以有效地减小问题的规模,从而提高算法的效率。点分治的基本思想是选择一个合适的树节点作为"重心"(Centroid),然后以该节点为根进行递归处理。选取重心的方法是找到使得删除该节点后最大子树的大小最小的节点,这样可以保证分解后的子树规模较为平衡。
2023-10-06 11:20:16 348
原创 【树】树的直径和重心
树的重心是指树中的一个节点,通过删除该节点后,将树分成多个子树,使得每个子树的节点数都不超过整棵树节点数的一半。换句话说,树的重心是树的一种结构特征,它能够将树尽可能平衡地分割成多个相对均匀的部分。说人话就是重心在树所有节点中,它的最大子树的节点最小选择任意一个节点作为树的根节点。对树进行深度优先搜索(DFS)或广度优先搜索(BFS),计算每个节点的子树大小(包括自身节点)。对于每个节点,计算删除该节点后,各个子树的大小(即除去该节点后,以其邻居节点为根的子树大小)。
2023-10-05 21:56:56 374
原创 【平衡树】splay伸展树
伸展树(Splay Tree)是一种自调整二叉搜索树,它通过不断进行伸展(splay)操作,将最近访问的节点移动到树的根节点,以提高对这些节点的访问效率。伸展树的主要特点是在插入、查找和删除操作时,都会执行伸展操作,使得最近访问的节点位于根节点,从而实现了一种局部性原理,即频繁访问的节点更容易被快速访问。伸展树的基本伸展操作有三种:伸展到根(Splay to Root):将某个节点x伸展到树的根节点,通过一系列旋转操作实现,使得x成为新的根节点。
2023-10-05 09:53:43 281
原创 【DP】最长上升子序列
最长上升子序列(Longest Increasing Subsequence,简称LIS)是一个在数列中寻找一个子序列,使得这个子序列中的元素按照升序/降序排列,并且长度最长。
2023-09-14 01:18:42 199
原创 【算法】倍增-ST表
倍增是一种常用的算法技巧,通常用于优化时间复杂度。它的核心思想是将原问题分解成若干个规模较小的子问题,通过对子问题的求解来得到原问题的解。具体来说,倍增算法通常采用二分思想,将问题规模不断缩小,直到问题规模足够小,可以直接求解。在计算机科学中,倍增算法通常用于解决一些需要快速求解的问题,例如等问题。通过采用倍增算法,可以将这些问题的时间复杂度从O(n)降低到O(logn),从而大大提高算法的效率。
2023-08-26 03:10:53 405
原创 缩点的综合应用(二)
找出入度为0的点,费用累加。入度不为0的点说明一定可以被一个已知点揭发(不然已经在之前return 0了,不用担心揭发他的人不能提前被揭发)。1.每个人都可以揭发一些人,如果一个人能被揭发,那就不需要管了,只需要管揭发他的人即可。所有我们只要管入度为0的人,如果不能被收买,那就任务失败!2.第一步,找出可以被收买的人,然后tarjan他,把他所构成的环缩成一个超级点即可,他的值换为能最小被收买的值。3.第二步,遍历一遍,若他既不能被收买,也没有和能被收买的人达成关系,他就是使任务失败的人。
2023-08-24 01:44:31 119
原创 【图论】缩点的综合应用(一)
缩点,也称为点缩法(Vertex Contraction),是图论中的一种操作,通常用于缩小图的规模,同时保持了图的某些性质。这个操作的目标是将图中的一些节点合并为一个超级节点,同时调整相关边,以便保持图的连通性和其他性质。具体步骤如下:选择一个要缩点的节点:选择图中的一个节点,将它合并到另一个节点上。合并节点:将选定的节点合并到另一个节点上,形成一个新的超级节点。通常情况下,选择入度或出度较小的节点进行合并,以减小新图的规模。调整边:将与被合并节点相邻的边重新连接到新的超级节点上。
2023-08-23 21:21:32 1440 1
原创 【图论】拓扑排序
拓扑排序是一种对有向无环图(DAG)进行排序的算法,使得图中的每个顶点在排序中都位于其依赖的顶点之后。它通常用于表示一些任务之间的依赖关系,例如在一个项目中,某些任务必须在其他任务之前完成。拓扑排序的步骤如下:找到入度为0的顶点:入度是指指向某个顶点的边的数量。首先,找到图中入度为0的顶点,它们是没有依赖关系的顶点,可以作为排序的起点。将入度为0的顶点移出图:选择一个入度为0的顶点,将其从图中移除,并将与之相邻的顶点的入度减1。重复步骤1和步骤2:重复上述步骤,直到所有顶点都被移除。
2023-08-23 20:22:40 634
原创 【专题】【图论】最短路的传送问题
这个是特殊情况,起点即终点,一路传送,其实多此一举,但没办法,只怪我们把图分层了。可知背景就是求最短路问题,但难点是可以使一条路距离缩短至0,那如何更好的利用这个机会呢?这题虽然是多源,但只有一个传送门,而且数据范围小,只有100,所以直接上floyd算法!即我们可以免费往下传一次,其实也就相当于两点距离为0了,这时终点应该9号节点。第三个是已经用过一次机会,已经在下面了,所以正常边。我们两重遍历,找出门,在两重暴力folyd即可。第一个是从上到下,是使用传送的边。A:不是已经知道在哪搭桥了吗?
2023-08-19 20:35:25 577
原创 【图论】Floyd算法
Floyd算法,也称为Floyd-Warshall算法,是一种用于解决所有节点对最短路径问题的动态规划算法。它可以在有向图或带权图中找到任意两个节点之间的最短路径。Floyd算法的基本思想是通过中间节点逐步优化路径长度。它使用一个二维数组来存储任意两个节点之间的最短路径长度,并通过不断更新这个数组来得到最终的结果。Floyd算法的时间复杂度为O(n^3),其中n是图中节点的数量。它适用于解决稠密图(边数接近节点数的平方)的最短路径问题,但对于稀疏图来说,可能存在更高效的算法。
2023-08-19 19:17:56 749
原创 【线段树】模板
线段树(Segment Tree)是一种用于解决区间查询问题的数据结构。它可以高效地支持和操作。线段树的基本思想是将一个区间划分为多个子区间,并为每个子区间维护一些信息。这些信息可以是区间内元素的等等,根据具体问题而定。线段树的构建过程是一个递归的过程。首先将整个区间划分为两个子区间,然后递归地构建每个子区间的线段树,直到区间长度为1。构建过程中,每个节点都会保存其对应区间的信息。线段树的查询操作也是一个递归的过程。
2023-08-07 16:46:38 126
原创 【树状数组】讲解(一)
树状数组(Fenwick Tree),也称为二叉索引树(Binary Indexed Tree,BIT),是一种用于高效处理动态数组前缀和的数据结构。它可以在O(log n)的时间复杂度内完成单点更新和区间查询操作。树状数组的主要应用是计算数组的前缀和。它通过将数组元素按照二进制表示的索引进行组织,使得每个节点存储一定范围内的元素的和。通过利用二进制的特性,树状数组可以高效地进行更新和查询操作。树状数组的更新操作可以通过不断将当前位置的索引加上其最低位的1来实现。
2023-08-04 16:19:07 155
原创 【图论】强连通分量
强连通分量(Strongly Connected Components,简称SCC)是图论中的一个概念,用于描述有向图中的一组顶点,其中任意两个顶点之间都存在一条有向路径。换句话说,对于图中的任意两个顶点u和v,如果存在一条从u到v的有向路径,同时也存在一条从v到u的有向路径,那么u和v就属于同一个强连通分量。强连通分量在许多图算法中都有重要的应用,比如强连通分量的计算可以用于解决图的可达性问题、强连通分量的缩点可以用于求解最小生成树等。注意:强连通分量是有向图!
2023-08-01 23:37:23 1271
原创 【图论】树上差分(边差分)
其实点差分和边差分区别不大。点差分中,d数组存储的是树上的节点边差分中,d数组存储的是当前节点到父节点的那条边的差分值。
2023-07-29 10:50:36 1795
原创 【数学】二维差分
二维差分是一种用于计算二维数据矩阵中相邻元素之间差异的方法。它可以帮助我们分析二维数据的变化趋势和模式。这样,差分矩阵Y的尺寸将比原始矩阵X的尺寸少1行和1列。差分矩阵Y中的元素表示了原始矩阵X中相邻元素之间的差异。需要注意的是,二维差分是一种简单的方法,可能无法捕捉到原始数据中的复杂模式。在某些情况下,可能需要使用更高级的技术和算法来分析二维数据。
2023-07-28 20:10:12 760
原创 【数学】差分数组(一维差分)
差分数组是指对一个进行差分操作得到的新数组。差分操作是指计算原数组中相邻元素之间的差异,并将这些差异作为新数组的元素。其中,,因为第一个元素没有前一个元素。差分数组的长度比原数组少1,因为差分操作会减少一个元素。差分数组中的元素表示了原数组中相邻元素之间的差异。需要注意的是,差分数组可以通过反向操作(即累加)来。这意味着,如果有原始数组的差分数组,可以通过对差分数组进行累加操作来还原原始数组。
2023-07-28 16:03:48 536
原创 【图论】LCA(倍增)
LCA通常指的是“最近共同祖先”(Lowest Common Ancestor)。LCA是一种用于解决树或图结构中两个节点的最低共同祖先的问题的算法。在树结构中,LCA是指两个节点的最近层级的共同祖先节点。例如,考虑一棵树,其中节点A是节点B和节点C的祖先,而节点D是节点B和节点C的共同祖先,但节点D不是最低层级的共同祖先。在这种情况下,LCA就是节点D。LCA算法在计算机科学中有广泛的应用,例如在计算树的最近公共祖先、解决图的连通性问题、计算有向无环图(DAG)的最近公共祖先等方面。
2023-07-27 22:07:57 2781
原创 【图论】Prim算法
最小生成树问题是指在一个连通无向图中找到一个生成树,使得树中所有边的权重之和最小。Prim算法的基本思想是从一个起始顶点开始,逐步扩展生成树,直到覆盖所有顶点。Prim算法的关键在于如何选择与生成树相连的边中权重最小的边。一种常用的方法是使用优先队列(最小堆)来存储候选边,每次选择权重最小的边加入生成树。Prim算法的时间复杂度为O(ElogV),其中V是顶点数,E是边数。它是一种有效的算法,适用于稠密图和稀疏图。
2023-07-26 19:29:42 1275
原创 【图论】kruskal算法
Kruskal算法是一种用于解决最小生成树问题的贪心算法。最小生成树是指在一个连通无向图中,选择一棵包含所有顶点且边权重之和最小的树。排序集合(并查集实现)形成环路,(即在同一集合)Kruskal算法的核心思想是通过不断选择权重最小的边,并判断是否形成环路来构建最小生成树。它不需要事先知道图的连通性,而是通过边的选择来逐步连接图中的顶点,直到所有顶点都被连接为止。需要注意的是,Kruskal算法适用于解决无向图的最小生成树问题,对于有向图则需要使用其他算法,如Prim算法。
2023-07-25 23:16:29 1073
原创 【图论】spfa算法
SPFA(Shortest Path Faster Algorithm)是一种用于解决单源最短路径问题的算法,它是对Bellman-Ford算法的一种优化。SPFA算法通过不断地更新节点的最短路径估计值来逐步逼近最短路径。SPFA算法的优化在于使用了队列来存储待处理的节点,而不是像Bellman-Ford算法那样使用了一个集合。这样可以避免重复处理节点,提高算法的效率。需要注意的是,SPFA算法适用于解决带有负权边的图的最短路径问题,但如果图中存在负权环,则算法无法得到正确的结果。
2023-07-25 21:45:17 138
原创 【图论】Dijkstra算法(基础版)
Dijkstra算法(迪杰斯特拉算法) 用来计算从一个点到其他所有点的最短路径算法,是一种单源最短路径算法。
2023-07-24 21:10:33 380
原创 【堆】概念+二叉堆模板
堆通常可以被看做一棵树,它满足下列性质:1.堆中任意节点的值总是不大于(不小于)其子节点的值;2.堆是一棵完全树。将任意节点不大于其子节点的堆叫做最小堆或小根堆,而将任意节点不小于其子节点的堆叫做最大堆或大根堆。常见的堆有二叉堆、左倾堆、斜堆、二项堆、斐波那契堆等等。二叉堆是完全二叉树,它分为两种: 最大堆和最小堆。最大堆:父结点的键值总是大于或等于任何一个子节点的键值。最小堆: 父结点的键值总是小于或等于任何一个子节点的键值。
2023-07-24 11:47:21 84
原创 【二分】进阶
二分算法(Binary Search Algorithm)是一种在有序数组中查找特定元素的算法。它的基本思想是将数组分成两部分,然后确定目标元素可能存在的那一部分,再在该部分中继续进行二分查找,直到或确定目标元素不存在。二分算法的时间复杂度为O(log n),其中n是数组的长度。由于每次都将搜索范围减半,因此它比线性搜索算法更高效。然而,二分算法要求数组是的,如果数组无序,则需要先进行操作。
2023-07-18 09:49:24 87
原创 【字典树】模板+讲解
字典树(Trie),也称为前缀树或字典树,是一种用于存储和检索字符串的数据结构。它是一种有序树,用于保存关联数组,其中键通常是字符串。字典树的特点是能够高效地进行字符串的插入、删除和查找操作。字典树的基本思想是利用字符串的公共前缀来节省存储空间和提高查询效率。树的根节点不包含任何字符,每个节点包含一个字符,从根节点到叶节点的路径上构成一个字符串。通过沿着树的路径遍历字符,可以找到相应的字符串。总的来说,字典树是一种非常有用的数据结构,特别适用于需要高效存储和检索字符串的场景。
2023-07-11 12:04:25 344
原创 【数学】素数的判断(普通法+埃氏筛法)
素数是指只能被1和自身整除的正整数。换句话说,如果一个数除了1和它本身以外没有其他因数,那么它就是素数。例如,2、3、5、7、11、13等都是素数,而4、6、8、9、10等就不是素数。素数在数学和计算机科学中都有广泛的应用。和既不是素数也不是合数!二.根据概念写出的暴力算法(
2023-06-05 18:07:18 487
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人