- 博客(26)
- 收藏
- 关注
原创 算法——数学知识(质数,约数,欧拉函数,快速幂)
对于每一对约数,我们只需检验其中的一个。我们每次检查每对中较小的一个。在埃氏筛法中,合数可能被多次筛去。我们想要一个合数被筛掉一次,那么每次筛就要用最小质因数筛。由算数基本定理可知,大于1的正整数都可以被写成若干个质数相乘。有多少个素数,显然我们不能满意对所有小于等于。对于每一个合数,我们都用质数把它筛掉。时,由于我们是从小到大枚举的质数,所以。时,由于我们是从小到大枚举的质数,所以。另外,对于 C++17,我们可以使用。的质因数最多只有一个。我们每次使用最小质因数筛掉合数。由于因数是成对分布的,所以。
2024-12-06 01:31:33
228
原创 算法竞赛进阶指南——递归与递推
当向上回溯时,观察上图,我们发现在合并成区间[3, 8]的过程中,左边是有序的,右边是有序的。所以一个数在左半边,另一个数在右半边的逆序对的数量(如果可以形成),就是左半边区间从8开始到尽头的数量。对于一个数列,我们将它一分为二。这就像把一个问题拆成了两个同类的子问题,即左半边的序列的排序问题和右半边序列的排序问题。一个数列逆序对的数量等于左半边逆序对的数量加右半边逆序对的数量加一个数在左半边另一数在右半边逆序对的数量。其次,显然,左右两边是否排序不影响一个数在左半边,另一个数在右半边的逆序对的数量。
2024-12-01 16:22:17
572
原创 c ++零基础可视化——字符串
c ++零基础可视化——字符串string定义:string str1 = "012345"; // 012345string str2 = str1; // 012345string str3(6, '#'); // ######string str4("012345");
2024-11-28 19:44:15
416
原创 c ++零基础可视化——vector
的人,先选出来的排在前面,后选出的排在后面。对题面的理解:每次选出的人都应该在第一个人的索引上加上k的倍数。启发:模拟题,题目不难,显然上面的代码精简。但我的方法很冗长复杂,究其原因还是没有熟练掌握vector的精髓之处。我与其对比,纵观我的代码,我总是想要存储数据,但这完全不必要。每次排出新的队伍,就保存在newNums中,再将新队伍newNums赋值给nums,最后将newNums清空。重新定义vector的大小。若比原先大,则用0填充新增的元素;本题面加深了我的理解力。这导致我的方法不够好。
2024-11-20 19:20:37
750
原创 c ++零基础可视化——数组
关于对加法的理解,一个人的编号加上2就是前进两个人。将 type T 的元素作为第一个参数,将 range 中的元素作为第二个参数的二进制运算,并返回一个可分配给 type T 的值。它包含 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。它包含 first 和 last 之间的所有元素,包括 first 指向的元素,但不包括 last 指向的元素。对数组的理解:和上面的方法相同,采用递推的方法求解阶乘并将其存储在数组中。序列中的初始和最终位置。
2024-11-17 21:14:39
852
1
原创 拓扑排序板子及其应用
int n, m;#define N100010n和m分别表示图中的节点数和边数。N是预定义的常量,表示节点的最大数量。e 和 ne 是数组,用于存储图的边信息。e[i] 表示边的目标节点,ne[i] 存储与当前节点相连的下一条边的索引。h数组用于存储每个节点的边的开始部分,即每个节点的邻接表的头部。idx 是用于填充 e和 ne 数组的当前索引。d数组用于存储每个节点的入度。queue 用于实现拓扑排序的队列,head 和 tail 分别是队列的头部和尾部索引。
2024-05-12 19:09:01
376
原创 FloodFill算法及其应用
给定一个地形图,浅色表示洼地,深色表示高地。向这个图中的一个格子注水,随后询问这个格子的四个方向上的格子,显然,只有浅色的格子才可以被洪水覆盖,高低不会被覆盖。这个算法可以在线性复杂度内找到某个点所在的连通块。
2024-05-11 22:12:58
1613
1
原创 并查集的作用、原理、实现及应用
每个集合用一棵树来表示,树根的编号就是整个集合的编号。每个节点存储它的父节点,p[x]表示x的父节点。如何求x的集合编号:while (p[x]!= x) x = p[x] 优化:路径压缩。如何合并两个集合:px是x的集合编号,py是y的集合编号。p[px] = py。如何判断树根:if (p[x] == x) 除了根节点之外p[x]都不等于x。
2024-05-05 19:05:31
221
原创 二分(整数二分,浮点数二分)
当我们将区间[l, r]划分成[l, mid - 1]和[mid, r]时,其更新操作是r = mid - 1或者l = mid;,此时为了防止死循环,计算mid时需要加1。当我们将区间[l, r]划分成[l, mid]和[mid + 1, r]时,其更新操作是r = mid或者l = mid + 1;,计算mid时不需要加1。
2024-05-05 17:13:24
311
原创 容斥原理及其应用
如果被计数的事物有A、B两类,则A类和B类元素的总和=A类元素个数+B类元素个数—既是A类又是B类的元素个数。即$$$$如果被计数的事物有A、B、C三类,那么,A类和B类和C类元素个数总和= A类元素个数+ B类元素个数+C类元素个数—既是A类又是B类的元素个数—既是A类又是C类的元素个数—既是B类又是C类的元素个数+既是A类又是B类而且是C类的元素个数。 即∣A∪B∪C∣∣A∣∣B∣∣C∣−∣A∩B∣−∣A∩C∣−∣。
2024-04-28 19:05:40
657
原创 数组模拟链表,链式前向星及其应用
define N100010//根据上图可以更好理解//head表示头节点的下标 e[i]表示节点i的值是多少 ne[i]表示节点下一个节点的下标//idx表示当前可以用的点的下标#define N100010邻接表有n个链表(n为图的节点数量)。其余初始化与链表的初始化类似。h[]存储每个顶点链表的头部索引。e[]存储边的目标顶点。ne[]存储同一链表中下一个元素的索引。idx是当前可用的数组索引。
2024-04-26 22:09:36
1760
4
原创 二叉树的前序遍历,中序遍历,后序遍历和层序遍历
【前序遍历】如果二叉树为空,则直接返回。否则,先访问根结点,再递归前序遍历左子树,再递归前序遍历右子树。【中序遍历】如果二叉树为空,则直接返回。否则,先递归中序遍历左子树,再访问根结点,再递归中序遍历右子树。层序遍历所要解决的问题很好理解,就是按二叉树从上到下,从左到右依次打印每个节点中存储的数据。(即逐层地,从左到右访问所有节点)。给定一个二叉树的根节点。给你一棵二叉树的根节点。
2024-04-19 19:56:23
732
原创 [NOIP2008 提高组] 笨小猴
但是他找到了一种方法,经试验证明,用这种方法去选择选项的时候选对的几率非常大!是一个质数,那么笨小猴就认为这是个 Lucky Word,这样的单词很可能就是正确的答案。共两行,第一行是一个字符串,假设输入的的单词是 Lucky Word,那么输出。是单词中出现次数最少的字母的出现次数,如果。是单词中出现次数最多的字母的出现次数,次,出现次数最少的字母出现了。次,出现次数最少的字母出现了。noip2008 提高第一题。【输入输出样例 1 解释】【输入输出样例 2 解释】(本处原题面错误已经修正)
2024-04-12 13:56:30
616
1
原创 洛谷 T3 句子反转题解
要求将这些单词倒序输出。而且对于每个单词,如果是小写词,应当转为大写;如果是大写词,应当转为小写;如果是自然数,应该倒转输出。给定一行句子,每个词之间用空格隔开,要么是全小写英文单词,要么是全大写英文单词,要么是自然数。的数据,句子中包含的单词数量不超过。仅一行,表示程序对句子的处理结果。仅一行,即需要反转的句子。,每个单词长度不超过。
2024-04-08 13:02:46
514
原创 顺序表实现栈
对于顺序表,在 C语言 中表现为数组,在进行栈的定义之前,我们需要考虑以下几个点:1)栈数据的存储方式,以及栈数据的数据类型;2)栈的大小;3)栈顶指针;我们可以定义一个栈的结构体,C语言实现如下所示:int// (1)100005// (2)// (4)int top;// (5)(1) 用DataType这个宏定义来统一代表栈中数据的类型,这里将它定义为整型,根据需要可以定义成其它类型,例如浮点型、字符型、结构体 等等;(2)maxn代表我们定义的栈的最大元素个数;
2024-04-07 18:50:50
1585
原创 快速排序和堆排序
快速排序采用的是分治思想,即在一个无序的序列中选取一个任意的基准元素pivot,利用pivot将待排序的序列分成两部分,前面部分元素均小于或等于基准元素,后面部分均大于或等于基准元素,然后采用递归的方法分别对前后两部分重复上述操作,直到将无序序列排列成有序序列。
2024-04-07 18:49:56
296
原创 堆排序的实现
调整堆(AdjustHeap)。调整堆的目的是确保以某个节点为根的子树满足堆的性质(最大堆或最小堆)。这里我们假设要实现的是最大堆。在堆(无论是最大堆还是最小堆)的数据结构中,左子节点和右子节点与它们的父节点之间存在特定的关系。这些关系确保了堆的性质得以维持。对于任何给定的父节点,其左子节点的索引通常可以通过公式计算得出,而右子节点的索引则通过公式计算得出。这里,是父节点在数组中的索引。
2024-04-06 17:09:04
362
1
原创 洛谷P1011车站问题题解
火车从始发站(称为第1站)开出,在始发站上车的人数为 a,然后到达第2站,在第2站有人上、下车,但上、下车的人数相同,因此在第2站开出时(即在到达第3站之前)车上的人数保持为a人。从第3站起(包括第3站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第n-1站),都满足此规律。于是通过倒数第二站总人数为m列出方程:g(n-2)a+g(n-1)b-b+a=m即b=(m-g(n-2)a-a)/(g(n-1)-1) (n>=3)
2024-04-06 15:06:20
604
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅