自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

struct_GS的博客

一只可怜的信奥小蒟蒻

  • 博客(33)
  • 资源 (1)
  • 问答 (1)
  • 收藏
  • 关注

原创 洛谷 P3953 逛公园

原题链接题目描述策策同学特别喜欢逛公园。公园可以看成一张NN个点MM条边构成的有向图,且没有 自环和重边。其中11号点是公园的入口,NN号点是公园的出口,每条边有一个非负权值, 代表策策经过这条边所要花的时间。策策每天都会去逛公园,他总是从11号点进去,从NN号点出来。策策喜欢新鲜的事物,它不希望有两天逛公园的路线完全一样,同时策策还是一个 特别热爱学习的好孩子,它不希望每天在逛公园这件事上花费太多的时间。如果11号点 到NN号点的最短路长为dd,那么...

2021-11-01 18:51:50 254

原创 C++ 强连通分量 - 缩点(Tarjan算法)

简介缩点如果两个顶点可以相互通达,则称两个顶点强连通 ( strongly connected ) 。如果有向图G的每两个顶点都强连通,称 G 是一个强连通图。有向图的极大强连通子图,称为强连通分量 ( strongly connected components ) 。Tarjan 算法是用来求有向图的强连通分量的。求有向图的强连通分量的 Tarjan 算法是以其发明者 Robert Tarjan 命名的。Robert Tarjan 还发明了求...

2021-10-24 19:14:51 747

原创 C++ 强连通分量 -- 割点(割顶)

简介割点: 割点集合:在一个无向图中,如果有一个顶点集合,删除这个顶点集合以及这个集合中所有顶点相关联的边以后,图的连通分量增多,就称这个点集为割点集合。在无向联通图 G = ( V ,E ) 中:若对于 x ∈ V , 从图中删去节点x以及所有与 x 关联的边之后,G 分裂成两个或两个以上不相连的子图, 则称 x 为 G 的割点。 简而言之, 割点是无向联通图中的一个特殊的点, 删去中这个点后, 此图不再联通, 而所以满足这个条件的点所构...

2021-10-24 18:57:31 1676

原创 C++ ST表

RMQ 问题:RMQ(Range Minimum/Maximum Query)问题是指:对于长度为 n 的数列 A,回答若干询问 RMQ (区间 [ l,r ] ),返回数列A中下标在 l, r里的最小/大值,也就是说,RMQ 问题是指求区间最值的问题。ST 表 st 表和线段树常被用来解决 RMQ 问题,两个各有优缺点:st 表运行效率高,但不能修改;线段树运行效率相对较慢,但支持修改操作。 st 表的合并复杂度为 O(1...

2021-10-13 18:54:52 1453

原创 C++ 线段树

线段树基本常识线段树是一种二叉搜索树(即每个节点最多有两颗子树),与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。 如下图,就是一颗 [1,10] 的线段树的分解过程: 由图可得出一个结论,线段树的最大深度不超过,且每一颗线段树需要 4*n 的辅助空间,如果没有开到 4*n ,那就完美 RE 了!!!线段树的的存储 线段树采用的是堆式储存法,即编号为 k 的节点的做儿子为 k...

2021-10-12 10:24:06 2808 1

原创 YbtOJ 击毁战车

前置知识: 无题目描述:解题思路:看到题目的那一瞬间,我脑海中曾闪现出一个想法——暴力! 然而,暴力肯定过不了,然后,我就去了趟卫生间,于是,便有了以下这个做法: 由于战车的速度有大有小,我们不能保证每次选择摧毁的战车是最优的。但知道距离 0 的位置,还知道速度,毫无疑问,可以求出战车到达 d 所需要的时间,而炮弹发射的间隔已知,可以根据贪心策略,每次选择距离 d 最近的战车摧毁(即:时间差最小的)。AC...

2021-10-10 15:18:54 160

原创 YbtOJ 修建道路(最短路径)

目录:前置知识题目描述解题思路AC 代码前置知识: 最短路径(Dijkstra)、二分算法、 链式前向星题目描述: 大概意思就是:求一条最短路径,其中 k 条路免费,求最小的值。解题思路: 这道题给我的感觉就是——不好做,像最短路径,又不像最短路径。 很明显,这 k 条免费的路是个麻烦——不能直接用最短路。 暴力免费的路的条数肯定过不了,数据超过了 200 也不能...

2021-09-22 21:27:13 381 1

原创 C++ 初赛之逻辑运算

什么是逻辑运算:逻辑运算又称布尔运算。布尔用数学方法研究逻辑问题,成功地建立了逻辑演算。他用等式表示判断,把推理看作等式的变换。这种变换的有效性不依赖人们对符号的解释,只依赖于符号的组合规律 。这一逻辑理论人们常称它为布尔代数。20世纪30年代,逻辑代数在电路系统上获得应用,随后,由于电子技术与计算机的发展,出现各种复杂的大系统,它们的变换规律也遵守布尔所揭示的规律。逻辑运算 (logical operators) 通常用来测试真假值。最常见到的逻辑运算就是循环的处理,用来判断是否该离开...

2021-09-08 16:16:37 413

原创 C++ 初赛之计算机发展史

第一代计算机: 第一代电子管计算机——ENIAC(The Electronic Numerical Integrator And Computer),1946年在费城公诸于世,发明人是美国人莫克利(JohnW.Mauchly)和艾克特(J.PresperEckert),它通过不同部分之间的重新接线编程,还拥有并行计算能力,但功能受限制,速度也慢。ENIAC的问世标志现代计算机的诞生,是计算机发展史上的里程碑。第二代计算机:第二代晶体管的发明大大促进计算机...

2021-09-08 15:32:30 369

原创 C++ 初赛之操作系统

Windows 操作系统:Windows操作系统,是由美国微软公司(Microsoft)研发的操作系统,问世于1985年。起初是MS-DOS模拟环境,后续由于微软对其进行不断更新升级,提升易用性,使Windows成为了应用最广泛的操作系统。Windows采用了图形用户界面(GUI),比起从前的MS-DOS需要输入指令使用的方式更为人性化。随着计算机硬件和软件的不断升级,Windows也在不断升级,从架构的16位、32位再到64位,系统版本从最初的Windows1.0...

2021-09-08 15:29:16 211

原创 C++ 对象

C++对象是指:定义一个类就相当于创建了一个新的class类型。要使用类,还必须用已经定义的类去说明它的实例变量(即对象)。在C++中,class类型一旦被定义,它的实例变量(对象)就能被创建,并初始化,且能定义指针变量指向它。实例化的类就是对像。类的对象的公共数据成员可以使用直接成员访问运算符 .来访问。就像 struct ,class 等,都可以。 对象也可以被一些变量修饰,如 const 。...

2021-09-08 14:16:06 2727

原创 C++ 类

什么是 C++:C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。 当然,这是众所周知的。 要深刻理解C++,首先要理解类(...

2021-09-08 11:45:07 137

原创 C++ 最短路径之Bellman-Ford算法

贝尔曼-福特(Bellman-Ford)是由 理查德·贝尔曼(Richard Bellman)和 莱斯特·福特 创立的,求解单源最短路径问题的一种算法。有时候这种算法也被称为 Moore-Bellman-Ford 算法,因为 Edward F. Moore 也为这个算法的发展做出了贡献。它的原理是对图进行V-1次松弛操作,得到所有可能的最短路径。其优于Dijkstra 算法的方面是边的权值可以为负数、实现简单,缺点是时间复杂度过高。但算法可以进行若干种优化,提高效率。 时...

2021-09-08 11:10:57 1195

原创 C++ 最短路径之Dijkstra算法

迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959年提出的,因此又叫狄克斯特拉算法。是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最短路径问题。迪杰斯特拉算法主要特点是从起始点开始,采用贪心策略,每次遍历到始点距离最近且未访问过的顶点的邻接节点,直到扩展到终点为止。Dijkstra算法 只能用于计算单源最短路,而且无法处理负权边。 时间复杂度:O()【代码实现】//假设有n个点,m条边,求1~n...

2021-09-08 11:09:37 1665

原创 C++ 最短路径之Floyd算法 \ Floyd-warshall算法

Floyd算法 和 Floyd-warshall算法 实际上是一个东西,只不过是名字不同罢了。Floyd算法又称为插点法,是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法,与Dijkstra算法类似。该算法名称以创始人之一、1978年图灵奖获得者、斯坦福大学计算机科学系教授 罗伯特·弗洛伊德 命名。Floyd算法的边权值可正可负,但需要使用邻接矩阵存储图的边权值。 时间复杂度:O()【代码实现】//...

2021-09-08 11:08:00 749

原创 C++ 最短路径

目录:最短路径简介Floyd算法 \ Floyd-warshall算法Dijkstra算法Bellman-Ford算法 \ SPFA算法Johnson算法A*算法最短路径简介:最短路径问题是图论研究中的一个经典算法问题, 旨在寻找图(由结点和路径组成的)中两结点之间的最短路径。 算法具体的形式包括: (1)确定起点的最短路径问题(即已知起始结点),求最短路径的问题。 (2)确定终点的最短路径问题(与确定起点的问题相反),...

2021-08-28 16:05:31 8140 3

原创 C++ 邻接矩阵与链式前向星

前置知识: 数组模拟链表,邻接矩阵边的存储方法: 边的存储方法有:邻接矩阵,邻接表,数组模拟邻接表,链式前向星…… 当前主流的存储方法是:邻接矩阵 和 链式前向星邻接矩阵:基本思想:用一个一维数组存储图中顶点的信息,用一个二维数组(称为邻接矩阵)存储图中各顶点之间的邻接关系。 在 数据较小 或 用Floyd算法 时,常用邻接矩阵,邻接矩阵在稠密图中表现得效率尤为高。 无向图的邻接矩...

2021-08-28 12:01:24 392

原创 YbtOJ 序列破解(最小生成树)

前置知识: 最小生成树,前缀和题目描述:解题思路: 又是熟悉的区间判断问题,对于这一类的问题,可以尝试考虑前缀和。 询问给定的区间就等同于提供了前缀和的差值,记录第 i 个数的前缀和为 sum[i] ,即区间 [l,r] 的和可以转化为 sum[r] - sum[l-1] 。 题目给出的任务是解出所有未知数的值。达到这个目的只需要判断是否每一个单独的区间都可以通过前缀和相减的方式得到,而题目要求得到代价和的...

2021-08-18 15:55:50 196

原创 C++ 最小生成树

前置知识:连通图:在无向图中,若任意两个顶点 u 与 v 都有路径相通,则称该无向图为连通图。强连通图:在有向图中,若任意两个顶点 u 与v 都有路径相通,则称该有向图为强连通图。连通网:在连通图中,若图的边具有一定的意义,每一条边都对应着一个数,称为权;权代表着连接连个顶点的代价,称这种连通图叫做连通网。生成树:一个连通图的生成树是指一个连通子图,它含有图中全部n个顶点,但只有足以构成一棵树的 n-1 条边。一颗有n个顶...

2021-08-17 16:24:37 2088 2

原创 YbtOJ 数列询问(并查集 )

目录:前置知识题目描述解题思路AC 代码前置知识: 并查集,前缀和题目描述:解题思路: 题意让我们判断小红的话在第几句出现了错误,如果直接 BF 的话肯定会爆(你问我为什么,因为我试过··· ···),那就要考虑优化,既然是一个连续的区间,那就可以声明一个前缀和数组 sum 来优化算法,既然有了前缀和,那么是不是可以用并查集来维护 - k (mod p)关系?是的,这道题目用并查集恰到好处。那么接下来就该考虑并查集的内部程...

2021-08-16 21:11:05 237

原创 YbtOJ 删数问题(区间 DP )

前置知识: 区间 DP ,动态规划题目描述:解题思路: 首先,这道题如果用搜索的话,是肯定会爆的,所以,需要用到动态规划。(搜索的代码这理解不展示了,有兴趣的 OIers 可以尝试一下。 给大家分享给两种动态规划的解题方法: 一、区间 DP 设:f[i][j] 表示按规则消去数列 a[l...r] 得到的最大值。 删去第 i 个数得到的最大值为 a[i] ,删除a[i.....

2021-08-15 21:49:55 268 2

原创 洛谷 P1541 乌龟棋

原题传送门:乌龟棋前置知识:动态规划(DP),递归,枚举、暴力题目大意: 一个长为 n 的棋盘,每走到一个格点,就能获得相应的的得分,开局自动获得第一个格点的得分,有 m 张可以前进的卡片,每场卡片可以前进 k (1 ≤ k ≤ 4) 个格子,每张卡片只能使用一次,问从第一个格点到第 n 个格点最大的得分。解题思路: 读一遍题目,你会发现这道题有点像深度优先搜索,也就是暴力,只需要在过程中声明一个sum 数组记录每种牌的数量...

2021-08-15 15:16:50 188 1

原创 C++ 区间 DP

区间DP 简介: 正所谓区间 DP ,就是在区间上进行 DP 。区间 DP 以区间的长度划分阶段,记录两个端点的坐标,通过合并小区间的最优解来求出大区间的最优解。 在一般的 区间 DP 题目中,区间 DP 的转移依赖于枚举分割点,由此,一般的区间 DP 的时间复杂度为 O() 。一维区间 DP: 一维区间 DP 又被称为普通的区间 DP 。顾名思义,就是在一维的数组上进行区间 DP。其中,最典型的例子就是 石子合并。题目大意...

2021-08-14 20:40:23 1541 5

原创 C++ register 关键字

register 简介: register 就像是汉语和英语中的形容词(不要问为什么只有两种语言,因为小编只会这两种),在 C++ 中 register 是用来修饰变量的。register 的作用: register 声明的变量是直接放在cpu的寄存器当中,而非就是通过内存寻址访问,这样就可以大大的提高程序的运行效率。 总而言之,写上不会亏。 还需要注意,register 声明变量只能在主函数或自定义内部。注意:是内部,定义在外...

2021-08-14 19:33:07 4539 5

原创 YbtOJ 躲避拥挤(并查集)

目录:前置知识并查集(路径压缩),快速排序(sort),结构体题目描述样例与数据范围解题思路前置知识:并查集(路径压缩),快速排序(sort),结构体题目描述:样例与数据范围:解题思路: 在并查集的专题里,当然是用并查集啦! 刚开始的时候,小编还以为是用搜索的(你看这个题,他多像搜索啊),再读一读题目,n 个点,m 条边,这很明显是个图论题啊(废话,并查集不就是图论...

2021-08-13 21:46:52 309 3

原创 C++ 并查集算法

并查集简介并查集,在一些有N个元素的集合应用问题中,我们通常是在开始时让每个元素构成一个单元素的集合,然后按一定顺序将属于同一组的元素所在的集合合并,其间要反复查找一个元素在哪个集合中。这一类问题近几年来反复出现在信息学的国际国内赛题中。其特点是看似并不复杂,但数据量极大,若用正常的数据结构来描述的话,往往在空间上过大,计算机无法承受;即使在空间上勉强通过,运行的时间复杂度也极高,根本就不可能在比赛规定的运行时间(1~3秒)内计算出试题需要的结果,只能用并查集来描述。...

2021-08-13 13:37:56 3209 6

原创 C++ AC自动机算法

目录:AC自动机简介如何构造 AC自动机算法实现1、建树 2、预处理失配指针 nex: 3、匹配AC自动机例题推荐AC自动机简介: 正所谓 AC自动机,就是能自动 AC 的算法。AC自动机全称:Aho-Corasick automaton,该算法于1975年产生于贝尔实验室,是著名的多模匹配算法。 实际上,AC自动机就是在 Trie 树上实现KMP,来达到完成多模式串匹配的效...

2021-08-12 19:08:15 1743 2

原创 C++ Trie树算法

什么是Trie树:又称单词查找树,字典树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。至于Trie树长什么样子呢?...

2021-08-12 12:59:06 1161 3

原创 C++ KMP算法

目录:KMP的起源BF算法KMP算法模板题推荐KMP的起源: KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出的,因此人们称它为克努特—莫里斯—普拉特操作(KMP就是取三个人名字的首字母作为该算法的名字)。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。 简而言之,就是三位信息界的Orz受够了暴力这种低效率的算法,共同研究了KMP这种优化算法,当然,K...

2021-08-11 17:17:18 267 2

原创 YbtOJ 分割矩阵(二分+前缀和)

小编有在洛谷找到一样的题目:Brownie Slicing G目录:前缀知识:题目要求:解题思路:直接上代码:前缀知识:本题解需要大家熟练掌握前缀和和二分算法的相关知识题目要求: 把n*m的矩阵分成a*b块,求最小价值块的价值最大。解题思路:最大化最小点权之和,显然考虑二分答案。考虑二分一个值x,如何判断x是否能作为答案,也就是判断x是否能作为所有点的点权之和最小的一块小子矩阵的点权之和。等价于其他的所有小子矩阵的...

2021-08-09 20:34:24 190 4

原创 C++ 二分算法

目录:二分法的基本思想二分法的适用情况二分法查找的思路如下二分法的基本思想: 二分算法是分治思想的产物之一。 二分算法是一个非常高效的算法,它常常用于计算机的查找过程中。 在用二分法进行查找时,查找对象的数组必须是有序的。 二分法查找是一种非常高效的搜索方法,主要原理是每次搜索可以抛弃一半的值来缩小范围。其时间复杂度是O(log2n),一般用于对普通搜索方法的优化。题目中若要求算法的时间复杂度是O(logn),那么这个算法基本上就是...

2021-08-09 20:12:03 232

原创 C++ 前缀和算法

目录:基本知识一维前缀和二维前缀和基本知识:前缀和是一种预处理算法,能大大降低时间复杂度。前缀和的操作对象主要是数组。 前缀和主要是计算之前数组元素的值之和。在解决区域问题时,可以减少遍历操作,减少时间复杂度。一维前缀和: 记原数组为a[n],前缀和数组为b[n]。那么b[i]内存储的内容为a[1]~a[i-1]的和。 即b[1]=a[1],b[2]=a[1]+a[2],b[3]=a[1]...

2021-08-09 19:55:36 2023

原创 洛谷 P2809 hzwer爱折纸

hzwer爱折纸解题思路:拿过题来,映入眼帘的就是本题良心的数据范围:1≤n≤15。可以确定,暴力搜索加上一些奇奇怪怪的特判就可以解决。但如何实现呢?不难想到深度优先搜索,边界条件就是当现在的纸条序列长度len等于理想纸条序列的长度m时。当然,需要把理想序列的倒序也判断了。最后就是实现纸条翻折的操作,很简单,这里就不详细讲解了(下面的代码中有注释)。建议每次搜索时把目标序列出入函数中否则会很麻烦(亲身体验)代码实现:#include<iostr...

2021-08-06 13:00:19 162 1

DevCpp6.5安装包

DevCpp6.5安装包

2021-08-17

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除