![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
OI
文章平均质量分 71
努力的老周
一个老码农,中年大叔。打过工,做过老板。
现有神兽一枚,努力培养神兽中。
展开
-
NOIP晋级之路
NOIP(CSP)晋级之路。供大家参考。学有余力,才参与竞赛。竞赛之路充满荆棘。特别说明一下。第2轮起点要求是提高组(CSP-S)一等奖后才能参加。在当年的 12 月到第二年的 1 月之间还有一个清华大学冬令营(THUWC)和北京大学冬令营(PKUWC),一般为期 3 天左右。...原创 2019-12-25 16:08:17 · 8762 阅读 · 0 评论 -
CSP复赛说明
文档目的本文档针对目标是第一次参加 CSP 复赛的同学,主要内容是包括 CSP 复赛提交要求和需要特别注意的地方。由于各省的要求会略微有所不同,本文档主要是依据浙江省的要求写的。CSP复赛说明特别说明本说明暂时只能针对浙江省,据说各省在提交上要求会有些区别。有任何疑问请务必详细咨询监考老师。考卷下面是 2018 年普及组复赛的文档,请务必注意红色部分。图1 20...原创 2019-12-09 09:58:56 · 12048 阅读 · 1 评论 -
OI中常见名词解释
缩写 全称 中文含义 备注 CCF China Computer Federation 中国计算机学会 NOIP National Olympiad in Informatics in Provinces 全国青少年信息学奥林匹克联赛 CSP J/S Certified Softw...原创 2019-12-05 16:08:08 · 8389 阅读 · 0 评论 -
OI比赛的核心
今天和一个参加CSP复赛的家长交流了些事情,所以有感写了这个。如果觉得不对,欢迎拍砖。问题来由山东某家长,小朋友刚参加了 CSP-J 组复赛,第二题出现 TLE ,整个山东第二题 100 分只有 5 人。家长说孩子思路是正确的,能否申述。我和家长巴拉巴拉了一大堆,这些不是核心。我告诉家长,OI考试核心是算法的复杂度,而不是思路。任何题目都有好多种解法。OI考试的核心是数学,是数学,是数学。...原创 2019-12-04 10:23:54 · 7834 阅读 · 0 评论 -
OI算法图谱
需要掌握的算法图谱。原创 2019-12-03 23:38:41 · 7474 阅读 · 0 评论 -
学习线段树(Segment Tree)
Segment Tree 线段树Segment ABCWhat is segment tree 什么是线段树线段树是一种二叉搜索树,什么叫做二叉搜索树,首先满足二叉树,每个结点度小于等于二,即每个结点最多有两颗子树,何为搜索,我们要知道,线段树的每个结点都存储了一个区间,也可以理解成一个线段,而搜索,就是在这些线段上进行搜索操作得到你想要的答案。下图是一个长度为 777 的线段树样子。What can segment tree do线段树是算法竞赛中常用的用来维护 区间信息 的数据结构。线原创 2022-05-16 22:00:27 · 326 阅读 · 0 评论 -
OI中的超级快读
超级快读使用 getchar() 来读取。但是只能读取数字。代码实现template <typename T>inline T read() { T x = 0, f = 1; char ch = getchar(); while (!isdigit(ch)) { if(ch=='-') { f = -1; ch = getchar(); } } while (原创 2022-02-21 08:37:56 · 844 阅读 · 0 评论 -
图论 —— 拓扑排序
拓扑排序基本概念在图论中,拓扑排序(Topological Sorting)是一个有向无环图(DAG, Directed Acyclic Graph)的所有顶点的线性序列。且该序列必须满足下面两个条件:每个顶点出现且只出现一次。若存在一条从顶点 AAA 到顶点 BBB 的路径,那么在序列中顶点 AAA 出现在顶点 BBB 的前面。有向无环图(DAG)才有拓扑排序,非 DAG 图没有拓扑排序一说。例如,下面这个图,它是一个 DAG 图,那么如何写出它的拓扑排序呢?这里说一种比较常用的方法:原创 2022-02-11 19:07:24 · 518 阅读 · 0 评论 -
图论 —— 二分图的最大匹配
基本概念二分图的匹配给定一个二分图 GGG,在 GGG 的一个子图 MMM 中,MMM 的边集 {E}\{E\}{E} 中的任意两条边都不依附于同一个顶点,则称 MMM 是一个匹配。二分图的最大匹配所有匹配中包含边数最多的一组匹配被称为二分图的最大匹配,其边数即为最大匹配数。最大匹配分类问题可以分为:没有权值匹配和有权值匹配。其中有权值匹配,又有两类问题:最大匹配和最小匹配。无权值匹配问题有六位教师:张、王、李、赵、孙、周,要安排他们去教六门课程:数学、化学、物理、语文、英语和程序设计。原创 2022-02-08 13:32:16 · 502 阅读 · 0 评论 -
图论 —— 染色法判断二分图
二分图定义二分图,又称二部图,英文名叫 Bipartite graph。二分图是什么?节点由两个集合组成,且两个集合内部没有边的图。换言之,存在一种方案,将节点划分成满足以上性质的两个集合。二分图性质如果两个集合中的点分别染成黑色和白色,可以发现二分图中的每一条边都一定是连接一个黑色点和一个白色点。二分图不存在长度为奇数的环。判定二分图我们可以使用 DFS 或者 BFS 来遍历图,根据二分图的性质来判定。由于 DFS 代码相对较少,我们一般使用 DFS 来判断二分图。这个方法称为染色法。原创 2022-02-07 11:41:15 · 722 阅读 · 0 评论 -
图论 —— Kruskal 算法求最小生成树
概述Kruskal 算法是一种常见并且好写的最小生成树算法,由 Kruskal 发明。该算法的基本思想是从小到大加入边。算法实现基于贪心算法。对于一个拥有 nnn 个顶点 mmm 条边的图,其最小生成树包括 n−1n-1n−1 条边。这个可以使用归纳法证明。具体证明过程,可以参考《算法导论》。最小生成树过程时间复杂度O(mlogm)O(mlogm)O(mlogm),适用于稀疏图。即当 m<n2m < n^2m<n2 时候使用。前置知识Kruskal 算法需要并查集支持的原创 2022-02-06 20:58:43 · 526 阅读 · 0 评论 -
图论 —— SPFA 模板
概述本文使用优先队列优化的 SPFA 算法。时间复杂度一般为 O(m)O(m)O(m),最坏为 O(nm)O(nm)O(nm)。使用场合求单源最短路径。支持负权边,但是不能有负权回路。对比 Dijkstra 算法基本可以替代 Dijkstra 算法,而且还支持负权边,速度比 Dijkstra 算法快。除非出题人卡数据。数组版数据定义const LL INF=0x3f3f3f3f3f3f3f3f;//顶点相关const int N=1e3+10;bool vis[N];//可见性原创 2022-02-06 15:54:36 · 171 阅读 · 0 评论 -
图论 —— Dijkstra 算法模板
概述本文是使用优先队列优化的 Dijkstra 算法。对应的时间复杂度为:O(mlogn)O(mlogn)O(mlogn)。数组版数据定义const LL INF=0x3f3f3f3f3f3f3f3f;//顶点相关const int N=1e3+10;bool vis[N];//可见性LL dis[N];//距离LL h[N];//头节点//边相关,邻接表const int M=1e6+10;LL e[M];//表示顶点i连接e[i]LL ne[M];//表示顶点原创 2022-02-06 15:40:44 · 445 阅读 · 0 评论 -
AtCoder ABC238 题解
个人评论昨天的 ABC 直接吧我打懵了,数学题多。????后面的两题还是今天补的。竞赛地址https://atcoder.jp/contests/abc238/tasks。A - Exponential or Quadratichttps://atcoder.jp/contests/abc238/tasks/abc238_a。简易题解给一个 nnn,问是指数函数(2n2^n2n)和一个平方函数(n2n^2n2)数据大。如果本题 nnn 比较小,我们可以直接计算出结果然后比较。但是本题 nn原创 2022-02-06 14:01:29 · 1617 阅读 · 3 评论 -
图论 —— 图的存储
概述图论相关题目难度在于建图,也就是将题目的内容,使用合适的数据结构来存储。图的存储有以下几种方法:邻接矩阵。邻接表。链式前向星。邻接矩阵顾名思义,就是使用一个二维数组来描述一个图。一般用于稠密图。a[i][j]=0a[i][j]=0a[i][j]=0 的时候,表示顶点 iii 到顶点 jjj 没有通路。a[i][j]=wa[i][j]=wa[i][j]=w 的时候,表示顶点 iii 到顶点 jjj 有一条权值为 www 的边。优点简单,速度快。缺点适用于稠密图。在算法竞赛原创 2022-02-05 14:07:49 · 905 阅读 · 0 评论 -
图论 —— 多源最短路
多源最短路相比较与单源最短路问题,多源最短路问题简单了很多。多源最短路只有一个 Floyd 算法。Floyd 算法其实是使用动态规划的思想实现的,核心是三重循环。设定nnn 表示图中顶点数据定义const LL INF=0x3f3f3f3f3f3f3f3f;//d[i][j] 表示从顶点i到顶点j的最短路径//初始值d,就是邻接矩阵中所有值的边LL d[N][N];初始化d for (LL i=1; i<=n; i++) { for (LL j=1;原创 2022-02-05 12:38:32 · 692 阅读 · 0 评论 -
图论 —— 单源最短路
最短路算法的知识图谱如下。图待补充。单源最短路径(single source shortest path SSAP)给定一个带权有向图 G=(V,E)G=(V,E)G=(V,E),其中每条边的权是一个实数。另外,还给定 VVV 中的一个顶点,称为源。要计算从源到其他所有各顶点的最短路径长度。这里的长度就是指路上各边权之和。这个问题通常称为单源最短路径问题。SSAP 中,我们需要掌握三种算法:Dijkstra 算法。Bellman-Ford 算法。SPFA 算法。下面我们来学习一下这三个算原创 2022-02-04 14:45:19 · 296 阅读 · 0 评论 -
算法竞赛中涉及的数据结构模板
前言这里总结的模板主要是用于算法竞赛,而不是用于面试或者实际工作。我们需要明白,算法竞赛中追求的是时间,也就是在最快的时间内完成特定的任务。而实际工作中,讲求的是稳定性,通用性。这是两个完全不同的领域。最大的一个区别有两个。区别一在实际代码中,我们经常看到动态内存申请。比如对二叉树的定义,实际项目中使用如下//定义如下struct BTREE { t_type vale; BTREE *lchild, *rchild;};//使用如下BTREE *root=new BTREE;.原创 2021-10-14 11:40:49 · 558 阅读 · 0 评论 -
大数求余数
问题提供两个数据 a,b,计算 a%b 的余数。你可能会觉得这个问题很简单。我们用 C++ 为例,如果 a 和 b 可以在 long long 表示范围,那么这个问题非常简单。但是如果 a 超过了 C++ 中 long long 都超过的数据,我们要如何求余数?计算过程分析比如求 443 % 3443\ \% \ 3443 % 3,我们先来演算一下。如下图,图像来自网络搜索。下面我们来解释一下完整的计算过程:1、第一个数字(百位)444:4%3=14\%3原创 2021-05-13 21:04:05 · 1605 阅读 · 1 评论 -
C++ 中自定义取模相关操作
算法竞赛中,我们经常需要使用到取模运算。下面总结一些取模操作,以备将来形成自己的算法支持包。typedef long long LL;加法取模目标实现 a+b 对 m 取模。函数原型LL modsum(LL a, LL b, LL m);实现LL modsum(LL a, LL b, LL m) { return ((a%m)+(b%m))%m;}减法取模目标实现 a-b 对 m 取模。函数原型LL modsub(LL a, LL b,原创 2020-11-02 11:19:26 · 527 阅读 · 0 评论 -
并查集——(三)C++ 使用 STL 的 map 实现查并集功能
综述我们接上一节,https://blog.csdn.net/justidle/article/details/108846236,继续讨论并查集问题。我们发现使用 C++ 数组实现并查集主要问题有以下几个:1、元素中不能支持负数。因为 C++ 规定数组的下标不能是负数。2、代码量相对比较大。实现并查集代码量相对有点大。使用 map 实现并查集我们可以使用 STL 的 map 这个数据结构来实现。map 本生就是两个数据的映射关系,天生就具有并查集的特点。而且 map 可以支持负数。原创 2020-09-28 14:20:19 · 3013 阅读 · 0 评论 -
并查集——(二)C++ 使用数组实现查并集功能
使用限制使用数组表示查并集只能表示非负数。因为 C++ 规定数组的下标不能小于零。数据定义我们要根据题目的数据大小进行定义数组的大小。这里我们使用 0 ~ 1e5 的范围。const int MAXN=1e5+4;int parent[MAXN];初始化主要目的是将 parent 数组的值初始化为 -1,表示每个元素的父节点为自己。void init() { memset(parent, -1, sizeof(parent);}查询查询元素 x 的父节点序原创 2020-09-28 11:49:29 · 1196 阅读 · 0 评论 -
并查集——(一)概述
并查集概念在计算机科学中,并查集是一种树型的数据结构,用于处理一些不交集(Disjoint Sets)的合并及查询问题。并查集数据结构表示常用的并查集实现有两种方法。使用数组我们使用数组来表示这样的数据结构。比如,我们知道这个集合最大元素个数为 10^5 个,也就是 1 ~ 10^5。那么我们可以定义一个数组来记录每个元素的父节点。const int MAXN=1e5+4;int parent[MAXN];memset(parent, -1, sizeof(parent))原创 2020-09-28 11:11:51 · 365 阅读 · 0 评论 -
高斯消元(Gaussian elimination)
我们将分两个部分来说明高斯消去,第一部分是数学方面,第二个部分是如何用 C++ 来实现。第一部分 数学知识什么是高斯消去高斯消元法(或译:高斯消去法),是线性代数规划中的一个算法,可用来为线性方程组求解。高斯消元的目标是将矩阵变为上三角矩阵,例如,对应的矩阵为就是一个上三角矩阵(upper triangular matrix)。对于一个线性方程组,我们可以写出两个矩阵(系数矩阵 coefficient matrix 和增广矩阵 Augmented Matrix),如下图所示。.原创 2020-11-24 14:45:01 · 27785 阅读 · 0 评论 -
三角形的数量
常看到的一个数学题,在三角形的边上有若干个点,然后问可以有几个三角形。题目三角形的2条边上分别有m和n个点(不包括三角形的顶点),这些点分别同这两条边相对的顶点有连线,这样组成了一个复杂的图形,问这个图形中包含了多少个不同的三角形。题解一个排列组合题目。考虑以A为顶点的三角形数量, 线段[A1,B] 上任取2点,同A可以组成三角形,因此总数量为C(n+2, 2)。与[A1,B] 类似的线段,共有m+1 条。总数为:。考虑以B为顶点的三角形数量, 线...原创 2020-08-19 13:36:11 · 2085 阅读 · 0 评论 -
算法技巧——双指针算法
前置知识C 和 C++ 的数组、指针。什么是双指针严格的来说,双指针只能说是是算法中的一种技巧。双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针)的指针进行扫描,从而达到相应的目的。双指针问题套路通俗的说,就是在数组遍历中,我们使用两个指针进行操作。所以双指针问题基本有以下几个细节:1、双指针的初始位置。根据双指针的分类,有两种可能。具体看下面的介绍。2、双指针的移动方法。根据双指针的分类,有两种可能。具体原创 2020-05-23 12:22:17 · 9783 阅读 · 8 评论 -
OI中2D地图 H 和 W 的含义
算法比赛中,经常会出现 2D 地图,一般的描述如下:H Ws11 s12 ⋯ s1Ws21 s22 ⋯ s2W⋮sH1 sH2 ⋯ sHW我们可以看到有两个关键参数 H 和 W。其中 H 表示水平方向有多少个点,W 表示垂直方向有多少个点。...原创 2020-05-20 10:32:22 · 923 阅读 · 0 评论 -
最长递增子序列(Longest Increasing Subsequence)
定义最长上升子序列(Longest Increasing Subsequence,LIS),在计算机科学上是指一个序列中最长的单调递增的子序列。问题描述给定一个长度为 N 的数组,找出一个最长的单调自增子序列(不一定连续,但是顺序不能乱)。例如:给定一个长度为 5 的数组{5, 6, 1, 2, 8},则其最长的单调递增子序列为 {5,6,8},长度为 3。解法动态规划时间复杂度该方法的时间复杂度为 。实现过程下面我们用一个实例来分析一下动态规划求解 LIS 的整个过程。原创 2020-05-19 16:03:10 · 3957 阅读 · 0 评论 -
OI中常见的数学符号
整除/同余理论常见符号1、整除符号。表示 x 整除 y,即 x 是 y 的因数。2、取模符号。表示 x 除以 y得到的余数。3、互质符号。表示 x 和 y 互质。4、最大公约数gcd(x, y)。在无混淆意义的时候,可以写作 (x, y)。5、最小公倍数lcm(x, y)。在无混淆意义的时候,可以写作 [x, y]。数论常见符号1、求和符号。...原创 2020-05-06 15:19:58 · 5696 阅读 · 0 评论 -
DFS 解题套路
DFS 解题套路如果碰到一个 DFS 题目,基本的代码套路如下:1、我们基本都是使用递归来解决 DFS 问题,因此要确定递归的结束条件,也就是 DFS 结束条件。2、写 DFS 函数套路框架。如下所示void dfs() {}int main() { 读入数据 dfs(); return 0;}3、确认 DFS 函数的参数。这个是最难的地方...原创 2020-03-17 17:47:42 · 2042 阅读 · 0 评论 -
牛顿法
概述牛顿迭代法(Newton's method)又称为牛顿-拉夫逊(拉弗森)方法(Newton-Raphson method),它是牛顿在17世纪提出的一种在实数域和复数域上近似求解方程的方法。多数方程不存在求根公式,因此求精确根非常困难,甚至不可能,从而寻找方程的近似根就显得特别重要。牛顿法的几何意义上图中 y=f(x) 是一个可微函数。设 r 是 f(x)=0 的跟,选...原创 2020-03-10 23:37:28 · 1593 阅读 · 0 评论 -
深度优先搜索
概述深度优先搜索,英文缩写为 DFS 即 Depth First Search,属于图算法的一种。其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。举例下图是一个无向图,如果我们从 A 点发起深度优先搜索,访问次序不是唯一的。则我们可能得到如下的一个访问过程:A -> B -> E(没路了,回溯到 A)-> C -> F -&...原创 2020-03-10 22:06:41 · 555 阅读 · 0 评论 -
为什么 BFS 可以搜索到最短路径
估计很多初学者对这个问题一直明白,为什么使用 BFS 进行广度搜索,一定可以搜索到最短路径。讲真,在学校里学习 BFS 的时候,自己也没完全确认为什么。老师这么教,课本这么写,我就这么理解。其实回答这个问题很简单,请大家仔细观察下图,也就是使用 BFS 完成对树的搜索。比如,我要搜索节点 A 到节点 G 的最短路径。如下动图所示:在 BFS 中,我们使用了数据结构中的一个队列(qu...原创 2020-03-10 12:02:37 · 6502 阅读 · 4 评论 -
辗转相除法过程动图展示
如下图:原创 2020-03-08 15:37:36 · 2510 阅读 · 0 评论 -
DFS 遍历树的过程动态展示
如下图:图例说明:已经访问的树节点。还没有访问过的树节点。在等待访问队列的树节点。原创 2020-03-08 15:35:57 · 571 阅读 · 0 评论 -
DFS 走迷宫过程动态展示
如下图:图例说明:表示已经访问过迷宫节点。表示正在访问的迷宫节点。在等待访问队列的迷宫节点。原创 2020-03-08 15:32:03 · 745 阅读 · 0 评论 -
线性搜索过程动图展示
原创 2020-03-08 15:28:43 · 422 阅读 · 0 评论 -
二分查找过程动图展示
原创 2020-03-08 15:25:15 · 2672 阅读 · 1 评论 -
BFS 遍历树的过程动态展示
如下图:图例说明:已经访问的树节点。还没有访问过的树节点。在等待访问队列的树节点。原创 2020-03-08 15:21:11 · 688 阅读 · 0 评论 -
BFS 走迷宫过程动态展示
如下图:图例说明:表示已经访问过迷宫节点。表示正在访问的迷宫节点。在等待访问队列的迷宫节点。原创 2020-03-08 15:17:33 · 624 阅读 · 0 评论