摘要: 珂朵莉树 0x00 绪言 Update:2022/11/23 原来文章大部分都是拼凑内容(现在也是.....),质量过低,所以进行了一次小换血,主要是对代码风格以及阅读体验进行了优化。 温馨提示:如果你幻想找到非指针珂朵莉树代码,那你可以停下了,就看这一篇文章即可,虽然这篇文章代码实现也是指针。但你 阅读全文
posted @ 2022-02-11 21:23 PassName 阅读(1776) 评论(0) 推荐(1)
摘要: 树的存储结构 1.双亲表示法 双亲表示法即采用一组连续的空间表示,其中根结点的双亲用-1表示。 双亲表示法的存储结构 #define MAX_TREE_SIZE 50 //树中最多的结点数 typedef struct{ char data; //数据元素 int parent; //双亲位置 }P 阅读全文
posted @ 2022-02-11 21:22 PassName 阅读(71) 评论(0) 推荐(0)
摘要: DFS连通性模型 1. 算法分析 使用dfs来判断是否两个点连通,也可以通过dfs来做计数 2.例题 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n∗n 的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。 同时当Extense处在某个格点时, 阅读全文
posted @ 2022-02-11 21:22 PassName 阅读(81) 评论(0) 推荐(0)
摘要: 双向广搜 所谓双向广搜,就是初始结点向目标结点和目标结点向初始结点同时扩展,直至在两个扩展方向上出现同一个结点,搜索结束。它适用的问题是,扩展结点较多,而目标结点又处在深沉,如果采用单纯的广搜解题,搜索量巨大,搜索速度慢是可想而知的,同时往往也会出现内存空间不够用的情况,这时双向广搜的作用就体现出来 阅读全文
posted @ 2022-02-11 21:21 PassName 阅读(579) 评论(0) 推荐(0)
摘要: 概念 广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。 泛洪算法Flood Fill 泛洪算法图形处理中的一个填 阅读全文
posted @ 2022-02-11 21:20 PassName 阅读(147) 评论(0) 推荐(1)
摘要: 多源BFS 多源BFS,即同时存在多个起点,然后要求计算出图中任意一个点距离所有起点的最短距离,即图中任意点到每个起点的距离的最小值。 和一般的BFS的区别在于存在多个起点,而我们可以对所有的起点建立一个虚拟超级起点S,S与所有给定的起点一步相邻。设S到点A的最短距离为x,则 min(给定的所有起点 阅读全文
posted @ 2022-02-11 21:20 PassName 阅读(80) 评论(0) 推荐(0)
摘要: CDQ分治 CDQ分治,传说中是一个神犇创造的算法。 在了解这种算法之前,我们有必要了解一下一种基本的思想:分治。 分治介绍 分而治之,将原问题不断划分成若干个子问题,直到子问题规模小到足以直接解决 子问题间互相独立且原问题形式相同,递归求解这些子问题,然后将各子问题的解合并得到原问题的解 一般步骤 阅读全文
posted @ 2022-02-11 21:19 PassName 阅读(722) 评论(0) 推荐(0)
摘要: 区间DP 一、问题 给定长为n的序列a[i],每次可以将连续一段回文序列消去,消去后左右两边会接到一起,求最少消几次能消完整个序列,n≤500。 f[i][j]表示消去区间[i,j]需要的最少次数。 则 若a[i]=a[j],则还有 这里实际上是以区间长度为阶段的,这种DP我们通常称为区间DP。 区 阅读全文
posted @ 2022-02-11 21:17 PassName 阅读(189) 评论(0) 推荐(0)
摘要: 单调队列优化DP 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素。因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的。 单调队列的一般应用: 维护区间最值 优化DP 优化方法加样 阅读全文
posted @ 2022-02-11 21:17 PassName 阅读(138) 评论(0) 推荐(0)
摘要: 在程序中使用static 变量 1. 局部变量 普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。 普通局部变量存储于进程栈空间,使用完毕会立即释放。 静态 阅读全文
posted @ 2022-02-11 21:16 PassName 阅读(45) 评论(0) 推荐(0)
摘要: 什么是记忆化搜索? 搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用 阅读全文
posted @ 2022-02-11 21:15 PassName 阅读(183) 评论(0) 推荐(0)
摘要: 数学角度 迭代公式代码解决问题 常用模板 for(int len=1;len<=n;len++) for(int L=1;L+len-1<=n;L++) R=l+Len-1; 对于一个迭代问题,首先可以考虑的是是不是可以打表。打表的实质就是针对输入数据的组合数很小的情况(或者是中间某个数值)下,解决 阅读全文
posted @ 2022-02-11 21:14 PassName 阅读(249) 评论(0) 推荐(0)
摘要: 状态机模型 我们知道,一般编写程序时都要画出流程图,按照流程图结构来编程,如果编写一个比较繁琐,容易思维混乱的程序时,我们可以利用有限状态机模型画出一个状态转移图,这样便可以利用画出的逻辑图来编写程序,简洁且不易出错。 那什么是有限状态机是什么意思呢?百度百科上这样解释: 有限状态机,(英语:Fin 阅读全文
posted @ 2022-02-11 21:13 PassName 阅读(66) 评论(0) 推荐(0)
摘要: 背包模型 背包问题就是考察对模型的应用。 先给几个模型: 多重背包问题 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 输入格式 第一行两个整数,N, 阅读全文
posted @ 2022-02-11 21:12 PassName 阅读(112) 评论(0) 推荐(0)
摘要: 动态规划(提高) 这玩意本质上和我前面所写的动态规划是差不多的,但是在体型,难度和思维上进行了提升,在我以后所记录的所有提高算法都是这个道理。 数字三角形模型 数字三角形模型是一个比较简单的DP模型,而且在这个模型中,用闫氏DP分析法可以很好的解决。 Hello Kitty想摘点花生送给她喜欢的米老 阅读全文
posted @ 2022-02-11 21:11 PassName 阅读(92) 评论(0) 推荐(0)
摘要: 前言 很多人觉得贪心算法就是个基础算法,十分的简单,实际上想真正学好贪心是很难的。y总说过,贪心的不确定性让贪心的难度超越了图论和动态规划。接下来这些贪心的内容可能会颠覆你的世界观(AcWing的同学可以划走了)。 区间问题 区间问题是贪心算法的一个小版块,一个看似简单实际恶心的玩意。它的方法就是做 阅读全文
posted @ 2022-02-11 21:10 PassName 阅读(186) 评论(0) 推荐(0)
摘要: 动态规划 动态规划就我们常说的 dp,我在这里总结一下动态规划的笔记。 动态规划是一种非常实用的思想,常用来解决最优化、计数问题 基本思想:要解一个给定的复杂问题,我们可以将其简化为解其更简单的子问题,在根据子问题的解得出原问题的解。 子问题需要满足的性质: 子问题的范围更小,且子问题个数有限。 最 阅读全文
posted @ 2022-02-11 21:08 PassName 阅读(127) 评论(0) 推荐(0)
摘要: 质数和约数 这个章节没啥说的,就是几个函数。 bool is_prime(int x)//判断质数函数 { if (x < 2) return false; for (int i = 2; i <= x / i; i ++ ) if (x % i == 0) return false; return 阅读全文
posted @ 2022-02-11 21:06 PassName 阅读(272) 评论(0) 推荐(0)
摘要: 前言:二分图的定义和判定 二分图也称二部图,是图论里的一种特殊模型,也是一种特殊的网络流。其最大的特点在于,可以将图里的顶点分为两个集合,且集合内的点没有直接关联,如下图所示。 如果某个图为二分图,那么它至少有两个顶点,且其所有回路的长度均为偶数,任何无回路的的图均是二分图。 见图2所示,其存在回路 阅读全文
posted @ 2022-02-11 21:04 PassName 阅读(377) 评论(0) 推荐(0)
摘要: 前言 最小生成树和最短路还是区别很大的,所以又双叒来写了。 Kruscal算法 最小生成树问题顾名思义,概括来说就是路修的最短。 接下来引入几个一看就明白的定义: 最小生成树相关概念: 带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。 最小生成树( 阅读全文
posted @ 2022-02-11 21:03 PassName 阅读(588) 评论(0) 推荐(0)
摘要: 前言 最短路问题分为两个模块,一个是单源最短路,一个是多源汇最短路。而其中有4个算法。所以可以分别总结一下。 Dijkstra 算法 这里介绍 Dijkstra 算法,它是一个应用最为广泛的、名气也是最大的单源最短路径算法Dijkstra 算法有一定的局限性:它所处理的图中不能有负权边 「前提:图中 阅读全文
posted @ 2022-02-11 21:02 PassName 阅读(1587) 评论(0) 推荐(0)
摘要: 概念 在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。 先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。 一直做改操作,直到所有的节点都被分离出来。 如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的 阅读全文
posted @ 2022-02-11 21:01 PassName 阅读(45) 评论(0) 推荐(0)
摘要: 个人认为BFS比DFS难度要大一些,所以来这里做个笔记。 比较可怜的是本蒟蒻并没有找到BFS这个东西解题有什么规律,所以我只能粘上3个代码。 模板 当然一个差不多点儿的模板还是要有的。 //模板1 #include<cstdio> #include<cstring> #include<queue> 阅读全文
posted @ 2022-02-11 21:00 PassName 阅读(48) 评论(0) 推荐(0)
摘要: 前几天有人跟我说,啊,说dfs一搜搜着搜着就把自己搜蒙了,说一写dfs就要dfs(int a,int b,int c),括号里面放一堆东西。啊今天我要澄清一下,dfs其实没有你想的那么复杂。 dfs这个玩意其实是有模板的: //DFS模板 inline void dfs(int u){ if(u== 阅读全文
posted @ 2022-02-11 20:59 PassName 阅读(46) 评论(0) 推荐(0)
摘要: 详细总结STL 为什么C比C更受人欢迎呢?除了C 的编译令人感到更舒适,C的标准模板库(STL)也占了很重要的原因。当你还在用手手写快排、手写二叉堆,挑了半天挑不出毛病的时候,C党一手STL轻松AC,想不嫉妒都难。 所以这篇随笔就带大家走进博大精深的C++STL,系统讲解各种STL容器及其用法、作用 阅读全文
posted @ 2022-02-11 20:57 PassName 阅读(471) 评论(0) 推荐(0)
摘要: 重载运算符 这篇随笔我来讲解一下C++语言中重载运算符的相关知识。 一、重载运算符的用途 这是一个比较哲学的问题:我们为什么要重载运算符? 理由就是,我们C语言中已经给出的运算符(包括算数运算符和逻辑运算符)只是针对C语言中已经给定的数据类型进行运算,假如我们想要对我们的自定义数据类型进行运算的话, 阅读全文
posted @ 2022-02-11 20:57 PassName 阅读(185) 评论(0) 推荐(0)
摘要: 字符串hash是指将一个字符串s映射为一个,使得该整数可以尽可能唯一的代表也就是唯一标识。换言之,如果两个字符的hash值相同那么我们可以认为两者相同。 这里使用的hash策略,便是把一个字符串的每一位赋予权值 假设都是大写的英文字母。 我们设 H[i]代表前i个hash值 那么 H[i]=H[i− 阅读全文
posted @ 2022-02-11 20:56 PassName 阅读(447) 评论(0) 推荐(0)
摘要: 1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。 2. 堆的基本操作 堆是一棵完全二叉树,高度为O(lg n),其基本操作至多与树的高度成正比。在介绍堆的基本 阅读全文
posted @ 2022-02-11 20:55 PassName 阅读(322) 评论(0) 推荐(0)
摘要: 并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作: 合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。 并查集的引入 并查集的重要思想在于,用集合中的一个元素代表集合 阅读全文
posted @ 2022-02-11 20:55 PassName 阅读(47) 评论(0) 推荐(0)
摘要: 前言 个人认为Trie比较简单,所以主要就‘笔记’一下二叉树。 1、二叉树的定义 二叉树(Binary Tree) 是由n个结点构成的有限集(n≥0),n=0时为空树,n>0时为非空树。对于非空树T TT: 有且仅有一个根结点; 除根结点外的其余结点又可分为两个不相交的子集Tl和Tr,分别称为T的左 阅读全文
posted @ 2022-02-11 20:54 PassName 阅读(159) 评论(0) 推荐(0)
摘要: 单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。 队列是一种先进先出(FIFO First In First Out)的数据结构,它类似于下面这幅图: 队列的进出方式类似于平时我们排队打饭,来排队的人从队尾进入,打完饭的人从队头弹出。 队列 阅读全文
posted @ 2022-02-11 20:53 PassName 阅读(128) 评论(0) 推荐(0)
摘要: 什么是单调栈? 从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈 单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小 单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大 模拟单调栈的数据push和pop 模拟实现一个递增单调栈: 现在有一组数10,3,7 阅读全文
posted @ 2022-02-11 20:51 PassName 阅读(100) 评论(0) 推荐(0)
摘要: 小前言 方便本文理解,代码部分变量名称较长。 前言 KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂,很多正规的书本把概念一摆出直接劝退无数 阅读全文
posted @ 2022-02-11 20:49 PassName 阅读(398) 评论(0) 推荐(0)
该文被密码保护。 阅读全文
posted @ 2022-02-11 20:48 PassName 阅读(9) 评论(0) 推荐(0)
该文被密码保护。 阅读全文
posted @ 2022-02-11 20:46 PassName 阅读(57) 评论(0) 推荐(0)
该文被密码保护。 阅读全文
posted @ 2022-02-11 20:45 PassName 阅读(29) 评论(0) 推荐(0)
该文被密码保护。 阅读全文
posted @ 2022-02-11 20:45 PassName 阅读(11) 评论(0) 推荐(0)
该文被密码保护。 阅读全文
posted @ 2022-02-11 20:44 PassName 阅读(131) 评论(0) 推荐(0)
摘要: ```c1. 运算符重载+、+= 连接字符串= 字符串赋值>、>=、<、<= 字符串比较(例如a < b, aa < ab)==、!= 比较字符串<<、>> 输出、输入字符串注意:使用重载的运算符 + 时,必须保证前两个操作数至少有一个为 string 类型。例如,下面的写法是不合法的: #incl 阅读全文
posted @ 2022-02-11 20:43 PassName 阅读(46) 评论(0) 推荐(0)
摘要: 一.解释 二.常用操作 1.头文件 #include <algorithm> 2.使用方法 a.binary_search:查找某个元素是否出现。 a.函数模板:binary_search(arr[],arr[]+size , indx) b.参数说明: arr[]: 数组首地址 size:数组元素 阅读全文
posted @ 2022-02-11 20:42 PassName 阅读(154) 评论(0) 推荐(0)
摘要: 一.解释 二.常用操作 1.头文件 #include <algorithm> 2.使用方法 a.binary_search:查找某个元素是否出现。 a.函数模板:binary_search(arr[],arr[]+size , indx) b.参数说明: arr[]: 数组首地址 size:数组元素 阅读全文
posted @ 2022-02-11 20:41 PassName 阅读(0) 评论(0) 推荐(0)