
模板
星辰浩宇
路在脚下
展开
-
数据的离散化
代码如下:int num[maxn]; //原数据数组int tp[maxn]; // 中间数组int ans[maxn]; //离散化后数组int n; //数据数量map<int, int> mp; //原数组与离散化后数据的映射关系int id[maxn]; //离散化后的数据对原数据的映射for (int i = 0; i < n; ++i) {...原创 2019-08-04 21:47:29 · 137 阅读 · 0 评论 -
二叉查找树(BST)的定义
二叉查找树(Binary Search Tree,BST)是一种特殊的二叉树,又称为排序二叉树、二叉搜索树、二叉排序树。二叉查找树的递归定义如下:要么二叉查找树是一颗空树 要么二叉查找树由根结点、左子树和右子树组成。其中左子树和右子树都是二叉查找树,且左子树上所有结点的数据域均小于或等于根结点的数据域,右子树上所有结点的数据域均大于根结点上的数据域。从二叉查找树的定义中可以知道,二叉查找树...原创 2019-08-15 07:30:50 · 750 阅读 · 0 评论 -
最长公共子序列(LCS)
最长公共子序列(Longest Common Sebsequence,LCS)的问题描述为:给定两个字符串(或数字序列)A和B, 求一个字符串,使得这个字符串是A和B的最长公共部分(子序列可以不连续)动态规划的做法令dp[i][j]表示字符串A的i号位和字符串B的j号位之前的LCS长度,可以分为两种情况(下标从1开始)(1)若A[i]=B[j],则dp[i][j]=dp[i-1][...原创 2019-08-20 13:05:49 · 160 阅读 · 0 评论 -
二叉查找树的基本操作
二叉查找树的基本操作有查找、插入、建树、删除查找操作在之前介绍的二叉树的查找操作时,由于无法确定二叉树的具体特性,因此只能对左右子树都进行递归遍历,但是二叉查找树的性质决定了可以只选择其中的一种进行遍历,因此查找将会是从树根到查找结点的一条路径,故最坏复杂度为O(h),其中h是二叉查找树的高度,于是可以得到查找操作的基本思路如果当前根结点root为空,说明查找失败,返回 如果需...原创 2019-08-15 07:31:06 · 543 阅读 · 0 评论 -
字符串hash初步
如果key不是整数,那么又当如何设计散列函数呢?一个例子是:如何将一个二维整点P的坐标映射成一个整数,使得整点P可以由该整数唯一的代表,假设一个整点P的坐标是(x,y),其中0<=x<=Range,那么可令hash的函数为H(p)=x*Range+y,这样对数据范围内的任意两个整点P1和P2,H(P1)都不会等于H(P2),就可以用H(P)来唯一的表示该整点P,接着便可以通过整数h...原创 2019-08-20 13:06:29 · 206 阅读 · 0 评论 -
二叉排序树(二叉查找树、二叉搜索树)
二叉排序树(Binary Sort Tree),又称二叉查找树(Binary Search Tree),亦称二叉搜索树。定义二叉排序树或者是一棵空树,或者是具有下列性质的二叉树:(1)若左子树不空,则左子树上所有节点的值均小于它的根节点的值;(2)若右子树不空,则右子树上所有节点的值均大于它的根节点的值;(3)左、右子树也分别为二叉排序树;(4)没有键值相等的节点。查找...原创 2019-08-20 13:07:07 · 941 阅读 · 0 评论 -
sscanf和sprintf的用法
常见的用法: scanf("%s",s);//按字符串读入 double k=0.0; sscanf(s,"%lf",&k);//将这一字符串输出为一个浮点数 sprintf(ss,"%.2f",k);//将这一浮点数输出为一个有两位小数的字符串 sscanf和sprintf是scanf和printf家族的一对成员,用于处理和分析字符串非常强大...原创 2019-08-11 15:44:55 · 1194 阅读 · 1 评论 -
c++ 整形浮点字符串 类型转换
一、C风格字符串1.<stdlib.h>中的转换函数atoi atol atollitoa ltoa ultoa lltoaatof ecvt fcvt gcvtstrtol strtoul strtoll strtod2.sprintf sscanf (功能更强大)二、std::string1.标准库转换函数(using namespace std;)to...原创 2019-08-11 15:46:38 · 403 阅读 · 0 评论 -
fill和memset的区别
fill函数的作用是:按照单元赋值,将一个区间的元素都赋予val值。函数参数:fill(vec.begin(), vec.end(), val); val为将要替换的值。#include <algorithm>fill(vec.begin(), vec.end(), val); //原来容器中每个元素被重置为valmemset函数的作用是:按照字节填充某字符...原创 2019-08-11 20:15:24 · 320 阅读 · 0 评论 -
平衡二叉树的基本操作
和二叉查找树相同,AVL树的基本操作有查找、插入、建树以及删除。查找操作由于AVL树是一颗二叉查找树,因此其查找的操作与二叉查找树相同代码如下:void search(node *root,int x){ if(root==NULL){ printf("search failed\n"); return; } if(x==root->data){...原创 2019-08-15 16:23:51 · 817 阅读 · 0 评论 -
AOV网和AOE网
顶点活动(Activity On Vertex,AOV)网是指用顶点表示活动,而用边表示活动间优先关系的有向图。图中不能出现有向环,否则会让优先关系出现逻辑错误。边活动(Activity On Edge,AOE)网是指用带权的边集表示活动。而用顶点表示事件的有向图。其中边权表示完成活动需要的时间。一般来说,AOE网用来表示一个工程的进行过程,而工程常常分为若干个子工程(即活动),显然,AO...原创 2019-08-24 19:18:00 · 1783 阅读 · 1 评论 -
从树的遍历看DFS和BFS
深度优先搜索(DFS)与先根遍历事实上,对所有合法的DFS求解过程,都可以将其画为树的形式,DFS的过程就是对这颗树进行先根遍历的过程。于是我们可以从中得到启发:碰到一些可以用DFS做的题目,可以把一些状态作为树的结点,然后问题就会转换为直观的对树进行先根遍历的问题。如果想要得到树的某些信息,也可以借助DFS以深度作为第一关键词的思想来对结点进行遍历,以获得所需要的结果。例如求解叶子...原创 2019-08-14 15:57:25 · 221 阅读 · 0 评论 -
C++中的swap函数
C++中的swap函数:交换函数好处:不用担心交换变量精度的缺失,无需构造临时变量,不会增加空间复杂度swap 包含在命名空间std 里面swap(a,b);(交换两个数)swap(a[i] = b[j]);(交换两个位置上的变量)...原创 2019-08-10 09:23:32 · 32808 阅读 · 2 评论 -
线扫描法
在算法竞赛中经常会使用到。原创 2019-08-04 21:56:38 · 921 阅读 · 0 评论 -
SPFA单源最短路算法
示例代码如下:#include <iostream>#include <string.h>#include <queue>using namespace std;const int MAX_N=100;const int MAX_M=10000;struct edge{ int v,next; int len;...原创 2019-07-27 07:18:28 · 127 阅读 · 0 评论 -
差分约束系统
差分约束系统概念问题转化解决的问题例题1:虽然蒜头君并没有多少钱,但是蒜头君办了很多张银行卡,共有 nn 张,以至于他自己都忘记了每张银行卡里有多少钱了。他只记得一些含糊的信息,这些信息主要以下列三种形式描述:银行卡 aa 比银行卡 bb 至少多 cc 元。银行卡 aa 比银行卡 bb 至多多 cc 元。银行卡 aa 和银行卡...原创 2019-07-27 08:21:11 · 245 阅读 · 0 评论 -
先序+中序遍历重建二叉树
假设已知先序序列为pre1,pre2,pre3……pren,中序序列为in1,in2,in3,……,inn,如图所示,那么由先序序列的性质可知,先序序列的第一个元素pre1是当前二叉树的根节点,再由中序序列的性质可知,当前二叉树的根节点将中序序列划分为左子树和右子树。因此,要做的就是在中序序列中找到某个结点ink,使的ink==pre1,这样就在中序序列中找到了根节点。易知左子树的结点个数是num...原创 2019-08-14 14:22:01 · 270 阅读 · 0 评论 -
后序+中序重建二叉树
模板如下:模板中最后的输出为层次遍历代码如下:#include<bits/stdc++.h>using namespace std;const int N=35;int post[N],in[N];int n;struct node{ int data; node *lchild=NULL; node *rchild=NULL;};node *create...原创 2019-08-14 14:22:15 · 575 阅读 · 0 评论 -
拓扑排序
有向无环图如果一个有向图的任意顶点之间都无法通过一些有向边回到自身,那么称这个有向图为有向无环图(Directed Acyclic Graph,DAG).拓扑排序拓扑排序是将有向无环图G的所有顶点排成一个线性序列,使得对图G中的任意两个顶点u,v,如果存在边u->v,那么在序列中u一定在v前面,这个序列又被称为拓扑序列。求解拓扑序列的方法步骤如下:一、定义一个队列Q,...原创 2019-08-19 20:46:52 · 170 阅读 · 0 评论 -
NULL与nullptr的关系
1)0是int型的字面值常量2) NULL 是预处理变量,定义在 cstdlib 中,其值是03) nullptr 是 nullptr_t 类型的字面值。传统意义上来说,c++把NULL、0视为同一种东西,有些编译器将NULL定义为 ((void*)0),有些将其定义为0.c++不允许直接将void*隐式的转化为其他类型,但是如果NULL被定义为 ((void*)0),...原创 2019-08-09 14:18:05 · 350 阅读 · 0 评论 -
二叉树的静态实现
二叉树的静态实现可以满足完全不使用指针,而简单使用数组来完成二叉树的所有操作。在定义二叉树时,采用的是二叉链表的结构,如下所示:struct node{ typename data;//数据域 node *lchild;//指向左子树的根结点的指针 node *rchild;//指向右子树的根结点的指针 };在这个定义中,为了能够实时控制新生成的结点的个数,结构体node中的...原创 2019-08-14 14:49:52 · 370 阅读 · 0 评论 -
树的静态写法
此处的树,子结点的个数没有限制且子结点没有先后次序的树树与二叉树的不同之处就在于树的子结点数可能会有很多,如果利用动态写法,利用链表的指针来指示的话会比较麻烦,利用静态写法,也就是用数组下标来代替所谓的地址,当然这需要事先开一个大小不低于结点上限个数的结点数组,因此结构体node的定义如下:struct node{ typename data;//数据域 int child[maxn...原创 2019-08-14 15:16:08 · 421 阅读 · 0 评论 -
树的遍历
树的先根遍历树的先根遍历,即总是先访问根节点,再去访问左右子树,是一个递归访问的概念,因为对根结点的子树而言,同样可以划分为根节点和若干子树,这种遍历方式称为树的先根遍历。代码如下:(简单框架)void preorder(int root){ printf("%d",Node[root].data);//访问当前结点 for(int i=0;i<Node[root]....原创 2019-08-14 15:38:40 · 884 阅读 · 0 评论 -
最长路径
对一个没有正环的图(指从源点可达的正环),如果需要求解最长路径长度,则可以把所有边的边权乘以-1,令其变为相反数,然后使用Bellman-Ford算法或SPFA算法求最短路径长度,将所得的情况取反即可。注意:此处不能使用Dijkstra算法,原因是其不能处理负边权的情况显然,如果图中有正环,那么最长路径是不存在的,但是,如果需要求最长简单路径(也就是每个顶点最多只经过一次的路径),虽然最长简单...原创 2019-08-24 19:33:36 · 4365 阅读 · 2 评论 -
堆的定义与基本操作
堆是一颗完全二叉树,树中每个结点的值都不小于(或不大于)其左右孩子结点的值,其中,如果父亲结点的值大于或等于孩子结点的值,那么称这样的堆为大顶堆,这时每个结点的值都是以它为根结点的子树的最大值;如果父亲结点的值小于或等于孩子结点的值,那么称这样的堆为小顶堆,这时每个节点的值都是以它为根结点的子树的最小值。堆一般用于优先队列的实现,而优先队列的实现默认情况下使用的是大顶堆。那么到底如何来建立...原创 2019-08-15 19:34:54 · 604 阅读 · 0 评论 -
哈密顿回路
哈密顿图(哈密尔顿图)(英语:Hamiltonian graph,或Traceable graph)是一个无向图,由天文学家哈密顿提出,由指定的起点前往指定的终点,途中经过所有其他节点且只经过一次。在图论中是指含有哈密顿回路的图,闭合的哈密顿路径称作哈密顿回路(Hamiltonian cycle),含有图中所有顶点的路径称作哈密顿路径(Hamiltonian path)。由来天文...原创 2019-08-13 08:23:57 · 4269 阅读 · 0 评论 -
LCA问题及倍增解法
概述:LCA(Lowest Common Ancestors),即最近公共祖先,是这样一个问题:在有根树中,找出某两个结点u和v最近的公共祖先(或者说,离树根最远的公共祖先)倍增解法:倍增解法的核心是分治思想。当已知两个点在树中的深度时,先让较深的结点向上走,直到两个结点深度一样;再二分找出离他们最近的公共祖先。我们记一个结点的父节点为它的2^0=1倍祖先,它的父节点的父节点为它...原创 2019-08-13 08:23:41 · 295 阅读 · 0 评论 -
树的定义与性质
树的概念在数据结构中,把树枝分叉处、树叶、树根抽象为结点,其中树根抽象为根节点,且对一棵树来说最多存在一个根节点;把树叶概括为叶子节点,且叶子结点不再延伸出心得结点,把茎秆和树枝统一抽象为边,且一条边只能用来连接两个结点(一个端点一个)。这样,树就被定义为由若干结点和若干条边组成的数据结构,且在树中的结点不能被边连接成环。树的常见性质1、树可以没有结点,这种情况下称之...原创 2019-08-13 08:45:58 · 729 阅读 · 0 评论 -
二叉树的递归定义
首先直接给出二叉树的递归定义1、要么二叉树没有根节点,是一颗空树2、要么二叉树由根节点、左子树、右子树组成,且左子树和右子树都是二叉树。递归定义就是用自身来定义自身递归函数必须存在两个概念:递归边界和递归式。其中递归式用来将大问题分解为与大问题性质相同的若干个小问题,递归边界则用来停止无休止的递归。二叉树的递归定义如下;二叉树中任何一个结点的左子树既可以是一颗空树,也可以是一颗...原创 2019-08-13 09:06:56 · 4194 阅读 · 0 评论 -
散列的定义与整数散列
一般来说,散列可以浓缩成一句话:将元素通过一个函数转化为整数,使得该整数可以尽量唯一地代表这个元素。其中,把这个转换函数称为散列函数H,也就是说,如果该元素在转换前为key,那么转换后就是一个整数H(key)常见的散列函数有直接地址法、平方取中法、除留余数法等。其中,直接地址法是指恒等变换H(key)=key或是线性变换(即H(key)=a*key+b),而平方取中法指取key的平方的中间若干...原创 2019-08-20 13:06:41 · 383 阅读 · 1 评论 -
二叉树的遍历
二叉树的遍历是指通过一定的顺序访问二叉树的所有结点。遍历方法一般有四种:先序遍历、中序遍历、后序遍历和层次遍历,其中,前三种一般使用深度优先搜索(DFS)实现,而层次遍历一般使用广度优先搜索(BFS)实现把一颗二叉树分为三个部分:根节点、左子树、右子树,且对左子树和右子树可以同样进行这样的划分,这样对树的遍历就可以分为对这三个部分的遍历,这三种方法中,左子树一定要先于右子树遍历,且所谓的“先中...原创 2019-08-14 14:19:59 · 750 阅读 · 0 评论 -
二叉树的存储结构与基本操作
二叉树的存储结构一般来说,二叉树使用链表来定义。和普通链表的区别是,由于二叉树的每个结点有两条出边,因此指针变成了两个-分别指向左子树的根节点地址和右子树的根节点的地址。如果某个子树不存在,则指向NULL,其他地方和普通链表完全相同,因此又把这种链表叫做二叉链表。定义方式如下:struct node{ typename data;//数据域 node *lchild;//指...原创 2019-08-14 14:19:41 · 1196 阅读 · 0 评论 -
树状数组-模板
int lowbit(int x) { return x & (x ^ (x – 1));}利用机器补码的特性,也可以写成int lowbit(int x) { return x & -x;}int getsum(int x) { int res = 0; for (; x; x -= x...原创 2019-08-04 21:22:56 · 126 阅读 · 0 评论 -
二维树状数组-模板
修改操作如下:void change(int i, int j, int delta){ A[i][j] += delta; for(int x = i; x < A.length; x += lowbit(x)) for(int y = j; y < A[i].length; y += lowbit(y)) C...原创 2019-08-04 21:33:51 · 330 阅读 · 0 评论 -
C++STL中全排列函数next_permutation的使用
next_permutation函数和prev_permutation函数原型为next_permutation(start,end)prev_permutation(start,end)这两个函数作用是一样的,区别就在于前者求的是当前排列的下一个排列,后一个求的是当前排列的上一个排列。对于next_permutation函数,其函数原型为:bool next_permu...原创 2019-09-05 11:27:48 · 323 阅读 · 0 评论 -
欧拉回路与欧拉路径
定义 欧拉回路:从图上一个点u出发不重复地经过每一条边后,再次回到点u的一条路径。 欧拉路径:从图上一个点u出发不重复地经过每一条边的一条路径(不必回到点u)。 欧拉图即存在欧拉回路的图,半欧拉图即存在欧拉路径的图。 而要求每个点只走一次的模型是哈密顿环。定理 (1)无向图欧拉回路的判定:图G为连通图,所有顶点的度为偶数。 (2)无向图欧拉路径的判定:图G为...原创 2019-08-13 08:24:11 · 480 阅读 · 0 评论 -
最长不下降子序列 (LIS)
最长不下降子序列是这样一个问题:在一个数字序列中,找到一个最长的子序列(可以不连续),使得这个子序列是不下降(非递减)的。令dp[i]表示以A[i]结尾的最长不下降子序列的长度,这样对A[i]来说就会有两种情况。(1)如果存在A[i]之前的元素A[j](j<i),使得A[j]<=A[i]且dp[j]+1>dp[i](2)它前面的元素均比它大,则dp[i]=1;...原创 2019-08-16 16:18:18 · 248 阅读 · 0 评论 -
堆排序
堆排序是指使用堆结构对一个序列进行排序,此处讨论递增排序的情况。考虑对一个堆来说,堆顶元素是最大的,因此在建堆完毕后,堆排序的直观思路就是取出堆顶元素,然后将堆的最后一个元素替换至堆顶,再进行一次针对堆顶元素的向下调整,如此重复,直到堆中只有一个元素为止。’具体实现时,为了节省空间,可以倒着遍历数组,假设当前访问到i号位,那么将堆顶元素欲i号位的元素交换,接着在[1,i-1]范围内对堆顶元...原创 2019-08-15 19:49:17 · 177 阅读 · 0 评论 -
哈夫曼树
经典的合并果子问题(有n堆果子,每堆果子的质量已知,现在需要把这些果子合并为一堆,但是每次只能把两堆果子合并在一起,同时会消耗与两堆果子质量之和等值的体力,显然,在进行n-1次合并后,就只剩下一堆了,为了尽可能节省体力,请设计出合并的次序方案,使得耗费的体力最少,并给出消耗的体力值)树的带权路径长度树的带权路径长度等于它所有叶子结点的带权路径长度之和。叶子结点的带权路径长度等...原创 2019-08-15 20:28:23 · 3558 阅读 · 0 评论 -
哈夫曼编码
对任意一颗二叉树而言,如果把二叉树上的所有分支都进行编号,将所有左分支都记为0,所有右分支都记为1,那么对树上任意一个结点,都可以根据从根结点出发到它的分支顺序得到一个编号,并且这个编号是所有节点中唯一的对任何一个非叶子节点,其编号一定是某个叶子结点编号的前缀,并且,对于任何一个叶子结点,其编号一定不会成为其他任何一个结点编号的前缀。这有什么用呢?假设现在有一个字符串,它由A、B、C、D这...原创 2019-08-15 21:01:53 · 1254 阅读 · 0 评论