02 2022 档案
STL stack容器
摘要:容器适配器是一个封装了序列容器的类模板,它在一般序列容器的基础上提供了一些不同的功能。之所以称作适配器类,是因为它可以通过适配容器现有的接口来提供不同的功能。 stack<T>容器适配器中的数据是以 LIFO 方式组织的,这和自助餐馆中堆叠的盘子、箱子中的一堆书类似。图 1 展示了一个理论上的 st
STL priority_queue容器
摘要:普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。 在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出 (first in, largest out)的行为特征。 首先要包含头文件#include<queue>, 他和queue不同
STL queue容器
摘要:一、定义 queue是一种容器转换器模板,调用#include< queue>即可使用队列类。 二、queue初始化 queue<Type, Container> (<数据类型,容器类型>) 初始化时必须要有数据类型,容器可省略,省略时则默认为deque 类型 初始化示例 queue<int>q1;
STL pair容器
摘要:1,pair的应用 pair是将2个数据组合成一组数据,当需要这样的需求时就可以使用pair,如stl中的map就是将key和value放在一起来保存。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。 pair的实现是一个结构体,主要的两个成员变量是first second 因为是
STL vector容器
摘要:前言 vector 容器是 STL 中最常用的容器之一,它和 array 容器非常类似,都可以看做是对 C++ 普通数组的“升级版”。不同之处在于,array 实现的是静态数组(容量固定的数组),而 vector 实现的是一个动态数组,即可以进行元素的插入和删除,在此过程中,vector 会动态调整
2022/2/15 随笔
摘要:前言 游记其实就是随笔,只不过地点发生在学习小组,不在我家而已。。。 一、打球被大爷 3-1 狂虐 今天我正在和班里的同学 小A 打球,老规矩 5 个球。 结果打着打着达到了 10-11(4分以上差一分可以追球) 这时迎面走来一大爷,说:“来小伙子ei,我和你试试。” 结果很显然,全靠大爷失误得分,
目录——南松的文章分类
摘要:最近觉得不整理整理有点乱,所以把这个作为目录置顶一下! 目录 我的学习笔记(都在个人主页,比赛详解不在主页) 重要笔记 IMNOTE:STL 历届 CSP 比赛详解 历届 COCI 比赛题目详解 NOI Online 题目详解 2021 JOI 题目详解 历届 APIO 比赛学习 USACO和历届洛
typeid关键词
摘要:typeid是c++的关键字,typeid操作符的返回结果是名为type_info的标准库类型的对象的引用(在头文件typeinfo中定义) ISO C++标准并没有确切定义type_info,它的确切定义编译器相关的,但是标准却规定了其实现必需提供如下四种操作: type_info类提供了publ
decltype关键词
摘要:简述 decltype 是 C++11 新增的一个关键字,它和 auto 的功能一样,都用来在编译时期进行自动类型推导。 decltype 是“declare type”的缩写,译为“声明类型”。 既然已经有了 auto 关键字,为什么还需要 decltype 关键字呢?因为 auto 并不适用于所
mutable关键词
摘要:类中的 mutable mutable 从字面意思上来说,是「可变的」之意。 若是要「顾名思义」,那么这个关键词的含义就有些意思了。显然,「可变的」只能用来形容变量,而不可能是「函数」或者「类」本身。然而,既然是「变量」,那么它本来就是可变的,也没有必要使用 mutable 来修饰。那么,mutab
goto关键词
摘要:1.前言 goto,一个蒟蒻一用就废,大佬一用就吊炸天的神奇关键字。 今天,我要来盘它!!! 2、goto只能在函数内实现跳转,不能跨函数跳转 因为标号label是局部有效的。 #include <iostream> #include <vector> using namespace std; vo
auto关键词
摘要:前言 这个东西在新版本的 C 语言中还是很常用的,尤其是用到 for 循环中。蒟蒻之前也是对这个了解不多,基本没用过(除非迫不得已,因为我的C++编译器太逊了,不支持此操作,用这个操作还得用在线 IDE,很麻烦),现在觉得有必要来整理整理了。 C++98 auto 早在C++98标准中就存在了aut
[暴力数据结构] 珂朵莉树
摘要:珂朵莉树 0x00 绪言 Update:2022/11/23 原来文章大部分都是拼凑内容(现在也是.....),质量过低,所以进行了一次小换血,主要是对代码风格以及阅读体验进行了优化。 温馨提示:如果你幻想找到非指针珂朵莉树代码,那你可以停下了,就看这一篇文章即可,虽然这篇文章代码实现也是指针。但你
树与森林
摘要:树的存储结构 1.双亲表示法 双亲表示法即采用一组连续的空间表示,其中根结点的双亲用-1表示。 双亲表示法的存储结构 #define MAX_TREE_SIZE 50 //树中最多的结点数 typedef struct{ char data; //数据元素 int parent; //双亲位置 }P
深度优先搜索— —提高Ⅰ
摘要:DFS连通性模型 1. 算法分析 使用dfs来判断是否两个点连通,也可以通过dfs来做计数 2.例题 一天Extense在森林里探险的时候不小心走入了一个迷宫,迷宫可以看成是由 n∗n 的格点组成,每个格点只有2种状态,.和#,前者表示可以通行后者表示不能通行。 同时当Extense处在某个格点时,
广度优先搜索— —提高Ⅲ(BFS优化)
摘要:双向广搜 所谓双向广搜,就是初始结点向目标结点和目标结点向初始结点同时扩展,直至在两个扩展方向上出现同一个结点,搜索结束。它适用的问题是,扩展结点较多,而目标结点又处在深沉,如果采用单纯的广搜解题,搜索量巨大,搜索速度慢是可想而知的,同时往往也会出现内存空间不够用的情况,这时双向广搜的作用就体现出来
广度优先搜索— —提高Ⅰ
摘要:概念 广度优先搜索算法(Breadth-First Search,BFS)是一种盲目搜寻法,目的是系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止。BFS并不使用经验法则算法。 泛洪算法Flood Fill 泛洪算法图形处理中的一个填
广度优先搜索— —提高Ⅱ
摘要:多源BFS 多源BFS,即同时存在多个起点,然后要求计算出图中任意一个点距离所有起点的最短距离,即图中任意点到每个起点的距离的最小值。 和一般的BFS的区别在于存在多个起点,而我们可以对所有的起点建立一个虚拟超级起点S,S与所有给定的起点一步相邻。设S到点A的最短距离为x,则 min(给定的所有起点
CDQ分治(初步入门)
摘要:CDQ分治 CDQ分治,传说中是一个神犇创造的算法。 在了解这种算法之前,我们有必要了解一下一种基本的思想:分治。 分治介绍 分而治之,将原问题不断划分成若干个子问题,直到子问题规模小到足以直接解决 子问题间互相独立且原问题形式相同,递归求解这些子问题,然后将各子问题的解合并得到原问题的解 一般步骤
动态规划— —提高Ⅳ
摘要:区间DP 一、问题 给定长为n的序列a[i],每次可以将连续一段回文序列消去,消去后左右两边会接到一起,求最少消几次能消完整个序列,n≤500。 f[i][j]表示消去区间[i,j]需要的最少次数。 则 若a[i]=a[j],则还有 这里实际上是以区间长度为阶段的,这种DP我们通常称为区间DP。 区
动态规划——提高Ⅴ(DP优化)
摘要:单调队列优化DP 其实单调队列就是一种队列内的元素有单调性(单调递增或者单调递减)的队列,答案(也就是最优解)就存在队首,而队尾则是最后进队的元素。因为其单调性所以经常会被用来维护区间最值或者降低DP的维数已达到降维来减少空间及时间的目的。 单调队列的一般应用: 维护区间最值 优化DP 优化方法加样
Static关键词
摘要:在程序中使用static 变量 1. 局部变量 普通局部变量是再熟悉不过的变量了,在任何一个函数内部定义的变量(不加static修饰符)都属于这个范畴。编译器一般不对普通局部变量进行初始化,也就是说它的值在初始时是不确定的,除非对其显式赋值。 普通局部变量存储于进程栈空间,使用完毕会立即释放。 静态
记忆化搜索
摘要:什么是记忆化搜索? 搜索的低效在于没有能够很好地处理重叠子问题;动态规划虽然比较好地处理了重叠子问题,但是在有些拓扑关系比较复杂的题目面前,又显得无奈。记忆化搜索正是在这样的情况下产生的,它采用搜索的形式和动态规划中递推的思想将这两种方法有机地综合在一起,扬长避短,简单实用,在信息学中有着重要的作用
迭代式
摘要:数学角度 迭代公式代码解决问题 常用模板 for(int len=1;len<=n;len++) for(int L=1;L+len-1<=n;L++) R=l+Len-1; 对于一个迭代问题,首先可以考虑的是是不是可以打表。打表的实质就是针对输入数据的组合数很小的情况(或者是中间某个数值)下,解决
动态规划——提高Ⅲ
摘要:状态机模型 我们知道,一般编写程序时都要画出流程图,按照流程图结构来编程,如果编写一个比较繁琐,容易思维混乱的程序时,我们可以利用有限状态机模型画出一个状态转移图,这样便可以利用画出的逻辑图来编写程序,简洁且不易出错。 那什么是有限状态机是什么意思呢?百度百科上这样解释: 有限状态机,(英语:Fin
动态规划——提高Ⅱ
摘要:背包模型 背包问题就是考察对模型的应用。 先给几个模型: 多重背包问题 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。 输入格式 第一行两个整数,N,
动态规划——提高Ⅰ
摘要:动态规划(提高) 这玩意本质上和我前面所写的动态规划是差不多的,但是在体型,难度和思维上进行了提升,在我以后所记录的所有提高算法都是这个道理。 数字三角形模型 数字三角形模型是一个比较简单的DP模型,而且在这个模型中,用闫氏DP分析法可以很好的解决。 Hello Kitty想摘点花生送给她喜欢的米老
贪心算法(进阶)
摘要:前言 很多人觉得贪心算法就是个基础算法,十分的简单,实际上想真正学好贪心是很难的。y总说过,贪心的不确定性让贪心的难度超越了图论和动态规划。接下来这些贪心的内容可能会颠覆你的世界观(AcWing的同学可以划走了)。 区间问题 区间问题是贪心算法的一个小版块,一个看似简单实际恶心的玩意。它的方法就是做
动态规划
摘要:动态规划 动态规划就我们常说的 dp,我在这里总结一下动态规划的笔记。 动态规划是一种非常实用的思想,常用来解决最优化、计数问题 基本思想:要解一个给定的复杂问题,我们可以将其简化为解其更简单的子问题,在根据子问题的解得出原问题的解。 子问题需要满足的性质: 子问题的范围更小,且子问题个数有限。 最
基础数学数论问题
摘要:质数和约数 这个章节没啥说的,就是几个函数。 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
二分图
摘要:前言:二分图的定义和判定 二分图也称二部图,是图论里的一种特殊模型,也是一种特殊的网络流。其最大的特点在于,可以将图里的顶点分为两个集合,且集合内的点没有直接关联,如下图所示。 如果某个图为二分图,那么它至少有两个顶点,且其所有回路的长度均为偶数,任何无回路的的图均是二分图。 见图2所示,其存在回路
最小生成树(详解)
摘要:前言 最小生成树和最短路还是区别很大的,所以又双叒来写了。 Kruscal算法 最小生成树问题顾名思义,概括来说就是路修的最短。 接下来引入几个一看就明白的定义: 最小生成树相关概念: 带权图:边赋以权值的图称为网或带权图,带权图的生成树也是带权的,生成树T各边的权值总和称为该树的权。 最小生成树(
最短路问题(详解)
摘要:前言 最短路问题分为两个模块,一个是单源最短路,一个是多源汇最短路。而其中有4个算法。所以可以分别总结一下。 Dijkstra 算法 这里介绍 Dijkstra 算法,它是一个应用最为广泛的、名气也是最大的单源最短路径算法Dijkstra 算法有一定的局限性:它所处理的图中不能有负权边 「前提:图中
拓扑排序
摘要:概念 在一个有向图中,对所有的节点进行排序,要求没有一个节点指向它前面的节点。 先统计所有节点的入度,对于入度为0的节点就可以分离出来,然后把这个节点指向的节点的入度减一。 一直做改操作,直到所有的节点都被分离出来。 如果最后不存在入度为0的节点,那就说明有环,不存在拓扑排序,也就是很多题目的无解的
BFS广搜小谈
摘要:个人认为BFS比DFS难度要大一些,所以来这里做个笔记。 比较可怜的是本蒟蒻并没有找到BFS这个东西解题有什么规律,所以我只能粘上3个代码。 模板 当然一个差不多点儿的模板还是要有的。 //模板1 #include<cstdio> #include<cstring> #include<queue>
DFS深搜小谈
摘要:前几天有人跟我说,啊,说dfs一搜搜着搜着就把自己搜蒙了,说一写dfs就要dfs(int a,int b,int c),括号里面放一堆东西。啊今天我要澄清一下,dfs其实没有你想的那么复杂。 dfs这个玩意其实是有模板的: //DFS模板 inline void dfs(int u){ if(u==
STL容器详解
摘要:详细总结STL 为什么C比C更受人欢迎呢?除了C 的编译令人感到更舒适,C的标准模板库(STL)也占了很重要的原因。当你还在用手手写快排、手写二叉堆,挑了半天挑不出毛病的时候,C党一手STL轻松AC,想不嫉妒都难。 所以这篇随笔就带大家走进博大精深的C++STL,系统讲解各种STL容器及其用法、作用
重载运算符
摘要:重载运算符 这篇随笔我来讲解一下C++语言中重载运算符的相关知识。 一、重载运算符的用途 这是一个比较哲学的问题:我们为什么要重载运算符? 理由就是,我们C语言中已经给出的运算符(包括算数运算符和逻辑运算符)只是针对C语言中已经给定的数据类型进行运算,假如我们想要对我们的自定义数据类型进行运算的话,
字符串Hash
摘要:字符串hash是指将一个字符串s映射为一个,使得该整数可以尽可能唯一的代表也就是唯一标识。换言之,如果两个字符的hash值相同那么我们可以认为两者相同。 这里使用的hash策略,便是把一个字符串的每一位赋予权值 假设都是大写的英文字母。 我们设 H[i]代表前i个hash值 那么 H[i]=H[i−
堆
摘要:1. 概述 堆(也叫优先队列),是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆)。它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等。 2. 堆的基本操作 堆是一棵完全二叉树,高度为O(lg n),其基本操作至多与树的高度成正比。在介绍堆的基本
并查集
摘要:并查集被很多OIer认为是最简洁而优雅的数据结构之一,主要用于解决一些元素分组的问题。它管理一系列不相交的集合,并支持两种操作: 合并(Union):把两个不相交的集合合并为一个集合。 查询(Find):查询两个元素是否在同一个集合中。 并查集的引入 并查集的重要思想在于,用集合中的一个元素代表集合
二叉树基础
摘要:前言 个人认为Trie比较简单,所以主要就‘笔记’一下二叉树。 1、二叉树的定义 二叉树(Binary Tree) 是由n个结点构成的有限集(n≥0),n=0时为空树,n>0时为非空树。对于非空树T TT: 有且仅有一个根结点; 除根结点外的其余结点又可分为两个不相交的子集Tl和Tr,分别称为T的左
单调队列
摘要:单调队列是指:队列中元素之间的关系具有单调性,而且,队首和队尾都可以进行出队操作,只有队尾可以进行入队操作。 队列是一种先进先出(FIFO First In First Out)的数据结构,它类似于下面这幅图: 队列的进出方式类似于平时我们排队打饭,来排队的人从队尾进入,打完饭的人从队头弹出。 队列
单调栈
摘要:什么是单调栈? 从名字上就听的出来,单调栈中存放的数据应该是有序的,所以单调栈也分为单调递增栈和单调递减栈 单调递增栈:单调递增栈就是从栈底到栈顶数据是从大到小 单调递减栈:单调递减栈就是从栈底到栈顶数据是从小到大 模拟单调栈的数据push和pop 模拟实现一个递增单调栈: 现在有一组数10,3,7
KMP 算法
摘要:小前言 方便本文理解,代码部分变量名称较长。 前言 KMP算法是我们数据结构串中最难也是最重要的算法。难是因为KMP算法的代码很优美简洁干练,但里面包含着非常深的思维。真正理解代码的人可以说对KMP算法的了解已经相当深入了。而且这个算法的不少东西的确不容易讲懂,很多正规的书本把概念一摆出直接劝退无数
string函数部分解释
摘要:```c1. 运算符重载+、+= 连接字符串= 字符串赋值>、>=、<、<= 字符串比较(例如a < b, aa < ab)==、!= 比较字符串<<、>> 输出、输入字符串注意:使用重载的运算符 + 时,必须保证前两个操作数至少有一个为 string 类型。例如,下面的写法是不合法的: #incl
二分查找binary_search
摘要:一.解释 二.常用操作 1.头文件 #include <algorithm> 2.使用方法 a.binary_search:查找某个元素是否出现。 a.函数模板:binary_search(arr[],arr[]+size , indx) b.参数说明: arr[]: 数组首地址 size:数组元素