ACM
ACM
陆氪和他的那些代码
学习可以偷懒,面试好好发挥就行
展开
-
ACM教程 - 排序算法全家桶(妈妈再也不用担心我的排序)
排序算法用作实现列表的排序,列表元素可以是整数,也可以是浮点数、字符串等其他数据类型。生活中有许多需要排序算法的场景,例如 同时,某些算法需要在排序算法的基础上使用(即在排序数组上运行),例如常见排序算法包括「冒泡排序」、「插入排序」、「选择排序」、「快速排序」、「归并排序」、「堆排序」、「基数排序」、「桶排序」。如下图所示,为各排序算法的核心特性与时空复杂度总结(文末附加「计数排序」、「希尔排序」)对于上表,需要特别注意排序算法主要可根据 稳定性 、就地性 、自适应性 分类。理想的排序算法具有以下特性特别原创 2022-07-07 11:32:02 · 887 阅读 · 3 评论 -
ACM教程 - 快速排序(常规 + 尾递归 + 随机基准数)
快速排序是(Quick Sort)是对冒泡排序的一种改进,是非常重要且应用比较广泛的一种高效率排序算法。快速排序算法有两个核心点,分别为 哨兵划分 和 递归 。以数组某个元素(一般选取首元素)为 基准数 ,将所有小于基准数的元素移动至其左边,大于基准数的元素移动至其右边。对 左子数组 和 右子数组 分别递归执行 哨兵划分,直至子数组长度为 1 时终止递归,即可完成对整个数组的排序。快速排序是通过多次比较和交换来实现排序,在一趟排序中把将要排序的数据分成两个独立的部分,对这两部分进行排序使得其中一部分所有数据原创 2022-07-01 14:37:44 · 717 阅读 · 0 评论 -
ACM教程 - 基数排序
基数排序,是一种非比较型整数排序算法,先把所有元素补位,让所有元素的位数相同,然后把序列中的每个元素按照位数进行分桶的一种算法,基数排序的实现方法分为两种:MSD和LSD。原创 2022-06-15 18:59:15 · 272 阅读 · 0 评论 -
ACM教程 - 桶排序
桶排序,简单来说就是将待排序序列,按照序列值的大小划分成几个桶,分别对每组进行排序,排完序之后再按照一定的顺序合并所有的桶,即排序完成。桶排序的步骤假定给定的待排序序列为首先,根据待排序序列的长度15,我们设定5个空桶。然后遍历序列,找到最大值56和最小值2,也就是说,序列里的值是2-56中间的值,我们有5个桶,计算一下,每个桶分别存储哪些范围的数据。计算得出每个桶包含的数值范围为(56 - 2 + 1) / 5 = 11,所以每个桶的存储范围分别为[2,13),[13,24),[24,35),[35,46原创 2022-06-14 14:36:24 · 280 阅读 · 0 评论 -
ACM教程 - 计数排序
计数排序(Count Sort)是一个非基于比较的排序算法,该算法于1954年由 Harold H. Seward 提出。它的优势在于在对一定范围内的整数排序时,它的复杂度为Ο(n+k)(其中k是整数的范围),快于任何比较排序算法。计数排序的思想是在给定的一组序列中,先找出该序列中的最大值和最小值,从而确定需要开辟多大的辅助空间,每一个数在对应的辅助空间中都有唯一的下标。...原创 2022-06-13 14:34:28 · 250 阅读 · 0 评论 -
ACM教程 - 堆排序
堆是一种叫做完全二叉树的数据结构。这里我们用到两种堆,其实也算是一种。Ps:小顶堆有误,节点3 和 节点2 换下位置!如上所示,就是两种堆。如果我们把这种逻辑结构映射到数组中,就是下边这样这个数组 arr 逻辑上就是一个堆。从这里我们可以得出以下性质(重点)以该数组为例,构建最大堆实现从小到大排序,几个要点如下...原创 2022-06-10 19:04:25 · 313 阅读 · 2 评论 -
ACM教程 - 希尔排序
希尔排序(Shell Sort)是插入排序的一种,它是针对直接插入排序算法的改进。希尔排序又称缩小增量排序,因 DL.Shell 于 1959 年提出而得名。它通过比较相距一定间隔的元素来进行,各趟比较所用的距离随着算法的进行而减小,直到只比较相邻元素的最后一趟排序为止。希尔排序目的为了加快速度改进了插入排序,交换不相邻的元素对数组的局部进行排序,并最终用插入排序将局部有序的数组排序。在此我们选择增量 gap=length/2,缩小增量以 gap = gap/2 的方式,用序列 {n/2,(n/2)/2..原创 2022-06-08 17:33:43 · 257 阅读 · 0 评论 -
ACM教程 - 冒泡排序
选择排序是一种简单直观的排序算法,其基本原理是每一次从待排序的数组里找到最小值(最大值)的下标,然后将最小值(最大值)跟待排序数组的第一个进行交换,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。反复的进行这样的过程直到待排序的数组全部有序。通过增加一个标志位 flag ,若某轮内循环未执行任何交换操作时,说明已经完成排序,因此直接返回。此优化使冒泡排序的最优时间复杂度达到 O(n)(当输入数组已排序时)...原创 2022-06-06 14:44:28 · 310 阅读 · 0 评论 -
ACM教程 - 插入排序
选择排序是一种简单直观的排序算法,其基本原理是每一次从待排序的数组里找到最小值(最大值)的下标,然后将最小值(最大值)跟待排序数组的第一个进行交换,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。反复的进行这样的过程直到待排序的数组全部有序。......原创 2022-06-04 09:59:31 · 269 阅读 · 0 评论 -
ACM教程 - 选择排序
选择排序是一种简单直观的排序算法,其基本原理是每一次从待排序的数组里找到最小值(最大值)的下标,然后将最小值(最大值)跟待排序数组的第一个进行交换,然后再从剩余的未排序元素中寻找到最小(大)元素,然后放到已排序的序列的末尾。反复的进行这样的过程直到待排序的数组全部有序。............原创 2022-06-03 14:16:00 · 257 阅读 · 0 评论 -
ACM技巧 - 多对象其一判空简写
背景一般在二叉树比较常见这种情景,比如我想判断仅仅“左节点或右节点其中一个为空”就 dosomething...,两个对象还好,那如果是多叉树呢?岂不是要排列组合啦~常见代码if ((null == root.left && null != root.right) || (null != root.left && null == root.right)) { // dosomething...}优化代码if (root.left ==原创 2022-04-22 18:50:18 · 510 阅读 · 0 评论 -
ACM工具 - Gvedit(画图工具)
PDF 下载地址:https://download.csdn.net/download/dream_weave/10781834原创 2018-11-13 13:59:40 · 2791 阅读 · 0 评论 -
ACM模板 - 背包(01、完全、多重)算法
注释版:#include<bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof a)using namespace std;typedef long long ll;const int MAXN = 1005;int dp[MAXN]; // 滚动数组int val[MAXN],weight[MAXN],num[MAXN...原创 2018-04-16 13:30:58 · 953 阅读 · 0 评论 -
ACM模板 - KMP算法
注释版_0:/* 时间复杂度:如果文本串的长度为n,模式串的长度为m,那么匹配过程的时间复杂度为O(n),算上计算next的O(m)时间,KMP的整体时间复杂度为O(m + n)。 算法说明: 1、先通过目标串(ttr)计算出对应的首尾最长前后缀长度(next[])对应的值 2、再通过计算出的(next[])“智能”处理目标串在主串......原创 2018-03-16 11:58:11 · 1058 阅读 · 0 评论 -
ACM教程 - Java实现深度优先遍历和广度优先遍历
深度优先遍历深度优先遍历是图论中的经典算法。其利用了深度优先搜索算法可以产生目标图的相应拓扑排序表,采用拓扑排序表可以解决很多相关的图论问题,如最大路径问题等等。根据深度优先遍历的特点我们利用Java集合类的栈Stack先进后出的特点来实现。我用二叉树来进行深度优先搜索。深度优先搜索的步骤(1)首先节点 1 进栈,节点1在栈顶。(2)然后节点1出栈,访问节点1,节点1的孩子节点3进栈,节点2进栈。(3)节点2在栈顶,然后节点2出栈,访问节点2。(4)节点2的孩子节点5进栈,节转载 2020-06-11 09:06:27 · 808 阅读 · 0 评论 -
ACM教程 - 贪心算法和动态规划的区别与联系
联系都是一种推导算法 都是分解成子问题来求解,都需要具有最优子结构区别1、贪心:每一步的最优解一定包含上一步的最优解,上一步之前的最优解则不作保留;动态规划:全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有的局部最优解2、贪心:如果把所有的子问题看成一棵树的话,贪心从根出发,每次向下遍历最优子树即可(通常这个“最优”都是基于当前情......转载 2020-04-15 23:23:13 · 497 阅读 · 0 评论 -
ACM技巧 - 解决浮点数判断容易出现的BUG
问题如图,这里的 bmi 变量,如果算出来是浮点数 bmi = 18.400078,那么就会跑到 else 语句去,其实呢,它应该是 bmi = 18.4,只是计算机计算的时候二进制内在的问题。所以,这里可以稍微改进下,这里只是举其中几种方法,方法很多。bmi < 18.5 即可。 +0.00....05,然后取到前一位。 API 自带处理保留小数。......原创 2020-03-18 14:58:58 · 444 阅读 · 0 评论 -
ACM教程 - 卡特兰数(Catalan)算法
一、什么是Catalan数(Catalan数是许多计数问题的最终形式)Catalan序列是一个整数序列,其通项公式是:递推公式 1:C(n) = C(1)*C(n-1) + C(2)*C(n-2) + ... + C(n-1)C(1),n>=2递推公式 2:令 h(0)=1,h(1)=1,Catalan数满足递推式:h(n)=h(n-1)*(4*n-2)/(n+1);举例,我们从中取出的 C......原创 2018-04-25 22:56:27 · 2457 阅读 · 0 评论 -
ACM教程 - 自适应辛普森积分
一、概念:辛普森积分是数值积分的一种,是中点公式和梯形公式的改进。二、解析:假定我们要求如下定积分:略微懂一点微积分知识的都知道,对于一个黎曼可积的函数,我们要求其在某个闭区间上的定积分,要先求该函数的不定积分,即先求原函数。就是找到一个函数 F(x),使得 F′(x)=f(x),然后根据牛顿—莱布尼茨公式去搞。即:而有时候原函数并不好求,比如要求原的函数长得......原创 2018-08-09 11:35:37 · 2016 阅读 · 0 评论 -
ACM模板 - 测试时间复杂度
案例:#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a);#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;set<int> st;void init()...原创 2018-08-03 11:38:07 · 1514 阅读 · 0 评论 -
ACM模板 - 程序对拍
一、概念:首先对拍程序,顾名思义,一个输入给两个程序分别跑一遍,看看对不对的上。对拍三步曲:生成一组输入数据; 把这组数据分别给两个程序运行,并生成两组输出数据; 比较两组输出数据。二、教程:my.cpp:自己错误的代码,编译成my.exe; std.cpp:标准代码(即:标程),编译成std.exe; rand.cpp:数据生成器,根据具体情况具体修改输入数据格式(数......原创 2018-08-03 13:22:53 · 617 阅读 · 0 评论 -
ACM模板 - Floyd(弗洛伊德算法)
一、理论:如何求任意两点之间最短路径呢?通过之前的学习我们知道通过深度或广度优先搜索可以求出两点之间的最短路径。所以进行n2遍深度或广度优先搜索,即对每两个点都进行一次深度或广度优先搜索,便可以求得任意两点之间的最短路径。可是还有没有别的方法呢?我们来想一想,根据我们以往的经验,如果要让任意两点(例如从顶点a点到顶点b)之间的路程变短,只能引入第三个点(顶点k),并通过这个顶点k中转即......原创 2018-09-07 21:48:19 · 896 阅读 · 0 评论 -
ACM模板 - 堆操作集合
手写版:/* 以下为 min heap 为例 */#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#define MOD 10...原创 2018-09-08 10:04:30 · 710 阅读 · 0 评论 -
ACM教程 - 强连通分量(Tarjan)
一、讲解一强连通定义:在有向图G<V,E>中,对于点集V'∈V, 点集中的任意两点都可达,则称V'为强连通。孤立的一个点也是一个强连通分量。在嵌套的多个环时 : {所有环上的点}为一个强连通分量( 最小环就是每个孤立点)注意一定是满足条件的最大点集。则上图中强连通分量有 {1},{2},{3},{7},{4,5,6}。tarjan的过程就是dfs过程:对图......原创 2018-10-28 19:55:32 · 1122 阅读 · 0 评论 -
ACM模板 - 树状数组
树状数组:一、概念:树状数组(Binary Indexed Trees,简称,BIT)是一种特殊的数据结构,这种数据结构的时空复杂度和线段树相似,但是它的系数要小得多。它可以方便地查询出一段区间中的数字之和。其查询和修改的时间复杂度均为O(logN),并且是一个在线的数据结构,可以随时修改并查询。我接下来用一道题目来介绍树状数组的几个基本操作。二、应用:区间求和类问题(前缀......原创 2018-08-04 18:49:57 · 744 阅读 · 0 评论 -
ACM技巧 - 为何要对 1000000007 取模?
大数阶乘,大数的排列组合等,一般都要求将输出结果对 1000000007 取模。为什么总是 1000000007 呢?大概是因为(我猜的):1000000007是一个质数。 int32位的最大值为2147483647,所以对于int32位来说1000000007足够大。 int64位的最大值为2^63-1,对于1000000007来说它的平方不会在int64中溢出。 所以在大数相乘的......转载 2018-08-04 11:37:37 · 9297 阅读 · 0 评论 -
ACM教程 - 基础篇
C/C++ 基础知识篇:点击打开链接 ACM IO 模板(控制台版): #include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define ssclr(ss) ss.clear(), ss.str("")#define INF 0x3f3f3f3f#defin......原创 2018-05-28 18:30:56 · 1420 阅读 · 4 评论 -
ACM模板 - 二分查找(完整版)
64种。理由如下:对其进行分类:取整方式:向下取整 向上取整 (共2种)区间开闭:闭区间 左闭右开区间 左开右闭区间 开区间 (共4种)问题类型:对于不下降序列a,求最小的i,使得a[i] = key对于不下降序列a,求最大的i,使得a[i] = key对于不下降序列a,求最小的i,使得a[i] > key对于不下降序列a,求最大的i,使得a[i] < key对于不上升序列a,求最小的......原创 2018-05-25 16:38:25 · 2440 阅读 · 0 评论 -
ACM模版 - 斯特林公式(阶乘位数) + 常规公式
#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;/*(floor) (log10(N)) + 1; // 求一个数的位数...原创 2018-05-25 15:26:44 · 1530 阅读 · 0 评论 -
ACM模板 - 平衡二叉树(插入、删除、创建、遍历、判断完全二叉树)
理论模板:#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define INF 3f3f3f3fusing namespace std;typedef long long ll;// 平衡二叉树结点template <typename ...原创 2018-05-18 14:05:34 · 1254 阅读 · 1 评论 -
ACM模版 - Manacher(最长回文子串)算法
注释版:#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;const int maxn=100100;char a[maxn*2...原创 2018-04-27 09:25:54 · 545 阅读 · 0 评论 -
ACM模板 - 树的创建(中 + 先、中 + 后、先 + 后)+ 树的遍历(先序、中序、中倒序、后序、层序)+ 求树高
注释版:#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a);using namespace std;typedef long long ll;const int maxn=50;int mid[maxn],po[maxn],pr[maxn];int...原创 2018-04-24 23:28:08 · 1127 阅读 · 0 评论 -
ACM技巧 - 为何 Acmer 喜欢将 INF 设置为0x3f3f3f3f?
ACM技巧 - 为何Acmer喜欢将INF设置为0x3f3f3f3f?原创 2018-04-23 11:58:45 · 795 阅读 · 2 评论 -
ACM模板 - 拓扑排序算法
注释版(邻接表_版本):#include<bits/stdc++.h>#define mem(a,b) memset(a,b,sizeof a);using namespace std;typedef long long ll;const int MAXV=1000;// 边结点struct ENode{ int adjvex; // 邻接点:弧头...原创 2018-04-18 23:32:58 · 672 阅读 · 0 评论 -
ACM模板 - 快速模幂算法
注释版:#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a);using namespace std;typedef long long ll;/* 快速模幂 - 详解对于任何一个整数的模幂运算:a^b%c对于b可以拆成二进制的形式(b0对应的是b二......原创 2018-04-22 00:33:52 · 811 阅读 · 0 评论 -
ACM模板 - 日期类
一、年月日-->星期X1、基姆拉尔森:w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7 // w:0:星期一...依此类推int cal1(int y,int m,int d){ if(m==1||m==2) m+=12,y--; int w=(d+2*m+3*(m+1)/5+y+y/4-y/100+y/400)%7;...原创 2018-05-28 20:14:24 · 856 阅读 · 0 评论 -
ACM模版 - 欧几里德(GCD)算法
#include<bits/stdc++.h>#include<cmath>#define mem(a,b) memset(a,b,sizeof a)#define INF 0x3f3f3f3fusing namespace std;typedef long long ll;ll gcd(ll a,ll b){ a=abs(a); b=abs(b); ...原创 2018-05-30 15:34:50 · 907 阅读 · 0 评论 -
ACM模板 - 欧拉函数(PHI)
直接单独求解:φ(n) = n * (1-1/p1) * (1-1/p2)....(1-1/pk),其中 p1、p2…pk 为 n 的所有素因子。比如:φ(12) = 12 * (1-1/2) * (1-1/3) = 4。int euler(int x){ int rs=x,a=x; for(int i=2; i*i<=a; i++) if(a%......原创 2018-07-30 14:40:17 · 995 阅读 · 0 评论 -
ACM教程 - (数论)正整数分解使得乘积最大问题
一、问题描述设 n 是一个正整数。现在要求将 n 分解为若干个自然数之和,使得自然数的成绩最大。输出这个最大的乘积。要求:(1)要求这些自然数 互不相同。(2)要求这些自然数 可以相同。二、问题分析1、要求这些自然数 互不相同:先来看几个数找找规律:(1)小于等于 4 的情况就不用说了。(2)从 5 开始写起:5=2+3,6=2+4,7=3+4,8=3+5,9=2+3+4,10=2+3+5,11=......原创 2018-07-15 16:28:45 · 3265 阅读 · 0 评论 -
ACM模板 - 字典树
01字典树:/*数组大小定义为:2e6+10,数组大小与 n,m 是无关的,只与 cid 的最大值相关,算出对应的最多位数,比如:此题目中 cid 最大值为 1000000,对应的二进制位数最多 20位,根据完全二叉树的结点公式,最多 2^21-1。因为这里是边作为 二进制位,结点作为 链接下一个结点的下标。又因为题目说了是 cid^pid 最大的数,所以根据异或相同则0,不同则1的性质......原创 2018-07-25 15:26:22 · 749 阅读 · 0 评论