自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(33)
  • 收藏
  • 关注

原创 最短路三种算法——Dijkstra|SPFA|Floyd用法详细对比总结

​是单元最短路算法,用于解决从一个点s出发,求s到其余所有点的最短距离,但是Dijkstra的应用有一个限制—所有边权必须>=0,不能有负边权不然Dijkstra不能用。对于这道题是与并查集一样都必须先初始化就像下面代码一样,把起点s到自己的距离初始化为0,到其它点的距离初始化为无穷大因为一个数据u有两个条件终点v和边权w,而题目是一条有向边,所以我们只需要用邻接表存一次就好接下来就是用优先队列去存储起点s到每个点的距离和点的编号,这样我们每次都能选出当前距离最小还没确定最短路径的点u。

2026-08-28 19:55:10 201

原创 【并查集】—详解

通俗来理解这个概念及做法就是把每个集合都先看成一棵树,把集合的代表元素看成树根,每棵树都代表一组集合,然后我们查看两个数是否在一个集合里面就只需要看两个数的树根是否相同,这是查找的部分,合并就相当于把一棵树的根接在另一颗树下面是它们有共同的根。这道题完全就是在并查集的模板上加了点小的改动,我们就是在查找和合并上再加了最小时间判断,其实我们观察一下题目不难看出来如果我们将修路顺序按所需时间长短来排序,用时短的先修用时长的后修,那么修最后一条路的时间就是我们的总时间。的时候,全部村庄连通,我们可以推导一下。

2026-08-28 17:56:37 234

原创 河南省萌新联赛2026第(六)场

若两个数字的 0‑1 标签不完全相同,必定存在某一位 0、1 不一样,对应的集合就可以区分这两个数,满足题目的条件。对于这道题我们很容易想到,如果区间长度为奇数那么不管怎样反转都不会对最终结果产生任何影响,如果区间长度为偶数,就会使奇偶位置交换这样最终采摘数会发生变化,所以我们对于这道题最好是只考虑偶数情况。接下来我们就该想什么情况下k的最小值=1,就代表着存在一台电梯同时停靠a,b两层,这样就可以直接等到答案为m-a+b;如果a=1||b=1那我们就可以直接坐max(a,b)-1号电梯直接去b层。

2026-08-25 19:34:09 178

原创 背包九讲—全解析(详细)

这个在背包问题里面算是比较难理解的点,因为它牵扯上了树,属于树形背包,所以我们必须要考虑树形结构父子节点之间的连接,对于这种背包题目给我们限制如果我们选择了一个物品,那么,它的父节点的物品我们也必须选择,有点类似于分组背包吧,但是又有很大不同,我们如果要选择子节点就必须选择它的父节点,那么我们就容易想到这道题最好用递归,从子节点向上递推,直到达到最优解。所以对于混合背包的解法,我们就可以分为三部分,先判断si的值,如果si=-1就用01背包模板解题,如果si=0就用完全背包,si>0就用多重背包。

2026-08-19 18:17:38 198

原创 倍增思想(ST表、共同祖先)

倍增其实就是成倍的扩大步伐,跳跃着去完成遍历,这样就可以更快的逼近目标,很大的减少了时间复杂度。核心:利用二进制,把一个数字拆成若干个 2 的幂次相加。例如:13=8+4+1,也就是 2+2+2;这就意味着我们不去一步跳 1,而是直接跳 8 步、再跳 4 步、再跳 1 步,。简单来说就是如果想跳的很远,我们就先去试大步,如果大步跳超了就换小一半的步,不断减半,直到凑够总步数f[k][u]代表:从 u 出发,跳 2^k步后到达哪里。跳 2步 = 先跳 2步,再跳 2步。

2026-08-17 11:16:40 205

原创 高精度乘除法

*数组存储规则:**下标 1 代表个位,下标越大数字越高位,数组只保留后 500 位(题目仅要求末尾 500 位)。高精度问题在竞赛中很常见,也经常与其他类型的题目混用,是比较基础的算法,有固定的模板可以直接用我们先来看高精度乘法。设数字 A 长度n,数字 B 长度m,乘积最大长度一定是 n+m,提前开大小为n+m的结果数组res,初始全 0。**高精度乘法的存储规则:**把数字倒着存入数组:个位存在下标 0,十位下标 1,百位下标 2以此类推。

2026-08-12 19:33:16 241

原创 dfs算法应用

6.E走完后下面又没有节点了,所以我们继续回退到B,但是B的阶段已经全部访问,所以有会从B回退到A。为啥上限是这个:剩下这么多份,每份至少 i,如果 i 太大,凑不齐,不用试。7.A剩下一个节点C我们继续访问,但是C没有子节点了,相当于访问结束。3.访问B的第一个子节点D,此时D下面什么都没有,证明走到头了。的全排列,要求所产生的任一数字序列中不允许出现重复的数字。份,且每份不能为空,任意两个方案不相同(不考虑顺序)。组成的所有不重复的数字序列,每行一个序列。5.B另一个子节点是E,我们局继续访问。

2026-08-07 09:40:52 247

原创 河南省2026萌新联赛第(三)场补题

链接:https://ac.nowcoder.com/acm/contest/138881/A来源:牛客网有 n 个任务。执行第 i个任务前,你的当前能量必须不少于 hih_ihi;任务完成后,能量变化 di,即变为当前能量+di每个任务必须且只能执行一次,你可以自由决定执行顺序。所有时刻能量都不能为负。已知 hi+di≥0,因此只要执行前满足门槛,执行后就不会立刻变成负数。求完成所有任务所需的最小初始能量。

2026-08-04 17:52:28 271 2

原创 二叉树的概念及用法

是每个节点,顺序不能互换。

2026-08-03 10:09:40 193

原创 bitset应用与相关题型

牛客竞赛是专业的编程比赛和算法训练平台,包括ACM校赛、ICPC、CCPC、信息学奥赛、NOIP、NOI等编程比赛提高训练营。适合初级小白编程入门训练,包含NOIP普及组提高组赛前集训、ACM区域赛前多校训练营。,存储的是二进制,里面每一位只保存0和1,一般用于背包问题或者集合求交并集,他一般会用在暴力超时的时候,如果我们一道题用暴力枚举会超时,我们就可以选择bitset将其转化成二进制相关问题,可以极大的优化代码。因为一组只能选一个数,用 tmp 临时存方案,避免同一组多选数字。题意:有 n 组数字,

2026-08-01 11:31:20 194

原创 优先队列(priority_queue)

我之前博客中有队列相关的知识点但是不完全,其中有简单队列也有单调队列,现在我们着重看一下优先队列。优先队列一般有两种用法---大根堆和小根堆一般用于求第k大/第k小的数或者贪心类问题;这道题我们可以用优先队列与pair结合用pair存储下标与成绩队列顶部一定为目前最大值。用优先队列时我们要注意当队列为空时不能用top/pop否则程序会崩溃。这道题我们就用小根堆,当堆里面有k个元素时堆顶就是第k大元素。的运动员得分最高,名次第。位运动员的获奖情况。数据流中的第k大元素。

2026-07-29 19:10:35 184

原创 暑假第一周题目及代码汇总(包括queue、map、vector、stack、set、二分)

定一个只包括'('')''{''}''['']'的字符串s,判断字符串是否有效。有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。每个右括号都有一个对应的相同类型的左括号。s = "()"truetrue​// 必须加上Solution类public:else{st.pop();

2026-07-25 12:55:38 200

原创 计蒜客完美k倍子数组

这道题主要考的是map的应用还有思维,写的时候你要想到—如果要让任意两个数相加等于k的倍数应该满足的条件是他们两个数的余数相加应该等于k或者他们本身就是k的倍数,例如k=7,3%7=3;而14正好是7的倍数,但是这样组成的子数组如果k是奇数的话长度最长只有2,因为我们不管在这个子数组里面加什么元素都会发现会破坏数组的完美,所以我们就可以得出一个结论,如果k是奇数那我们的字数组只有两种情况,一种是—全是k的倍数形成的子数组;

2026-07-25 11:05:21 218

原创 队列——切蛋糕

题目要求小Z能得到的最大幸运值就相当于求在一段长度小于m的任意长度区间内,能得到的最大幸运值,如果全为正可直接用前缀和解决,只需要求出值最大的段区间的和就行,但这道题我们需要考虑负数的情况就要再加上单调递增队列。因为段区间在[l,r]间,所以r-l-1<=m;这道题是前缀和与单调队列的结合。

2026-07-21 19:23:06 213

原创 单调队列——滑动窗口

从队列尾部往前看,如果队列末尾存的下标对应的数字,比现在遍历到的数字更大,那末尾这个数字永远不可能成为任何窗口的最小值,直接删掉。,队列内元素下标对应的数值严格保持单调递增 / 递减,只能在队尾插入、队头删除,用来快速求区间最值,时间复杂度 O(n)。检查队列最前面的下标,如果这个下标已经跑到当前窗口左边外面了(不在长度 k 的窗口里),就把它从队头删掉。单调递增队列:队头最小,整个队列严格单调递增用于滑动窗口求最小值。单调递减队列:队头最大,整个队列严格单调递减用于滑动窗口求最大值。

2026-07-21 14:43:10 215

原创 训练赛D题、E题题解

我们先来看D题的题目其实这道题就是很典型的数学规律题,基本上不涉及任何算法,我们首先要理解题目意思,他说的是对于n个数中的每个数都要求出包含该数字数组的最小长度,根据所给的样例我们可以知道当n==1||n==2时都无法进行数字的删除,所以这种情况下我们直接输出对应的数就好,而对于2以上的数字,我们稍微想一下就可以发现不管这个数是几,包含他的最小数组长度都为2。我们再来看E题题目Yousef 给了你一个包含 n 个正整数的数组 a。定义 f(a)为数组 a 中所有乘积能被 6整除的子数组数量。

2026-06-08 14:32:16 192

原创 二维差分数组

只修改 4 个点,O(1) 完成子矩形批量修改。用途:二维子矩阵批量加减,高效替代暴力遍历。核心:修改 四个点 且最后一次前缀和还原。最后对差分数组做二维前缀和即可。,就能得到最终修改后的数组。

2026-06-02 20:08:28 241

原创 牛客周赛Round145 B 题及小红的最佳区间题目解析

对每一个给定区间 [li, ri] ,能让它和你区间重叠的 L 是一个区间:[li−k , ri]- 原问题变成:数轴上有 n 个区间,找一个点 L,被最多区间覆盖,求这个最大覆盖数。- 到 x=6:离开 → −1(因为 5 还在区间内,6 才出去)你选 L=1 → 你的区间 [1,3]和区间1、区间2都重叠 → 答案=2。- 每进入一个区间 → 覆盖数 +1。- 每离开一个区间 → 覆盖数 −1。我们的区间是 [L, L+k]- (位置, +1):开始覆盖。- (位置, −1):结束覆盖。

2026-05-29 17:06:57 276

原创 2026年临沂大学程序设计挑战赛A题B题解析

首先对于A题我们先看题目:单看这道题的题面我刚开始只能想到用字符串查找,一个一个比较,但是这样显然太过麻烦还很容易出错,所以我们要用其他方法,我想了想发现这道题是一个类似二分查找的问题,我们先设l=0,再设r=n-1,只要s[l]和s[r]不相等,就意味着我们要删除它,删除次数cnt就要加一,接着再继续比较s[l+1]和s[r]如果相等就可以让l++,不行的话就比较s[l]和s[r-1]如果相等就让r--;

2026-05-25 16:17:57 806

原创 牛客周赛 Round 142 C题及D题题解

要写这道题我们首先要搞懂题目意思其实就是一道简单的枚举,第一个人向右传 0 或 1 颗糖,然后递推验证整圈是否能合法均分糖果,能的话输出 “YES”,不能的话就输出 “NO”。2.由题意可知最后每个小朋友的糖书应该都相等,所以都为平均值avg,所以我们也要先计算出平均值。4.如果小朋友递出去的糖果数目小于0或大于1都违反了题目规则,直接就可以返回false.3.每个小朋友递出去的糖数应该为从上一个小朋友手里拿到的糖数减去平均糖数。7.只要有一个返回true,我们就可以输出YES,否则输出NO。

2026-05-22 22:17:05 52

原创 第八届河北省大学生程序设计大赛C题与I题题解

CIDR表示法通过在IP地址后面附加一个斜 线’/’ 和一个在0到32之间(含0和32)的数字来表示网络号的长度)所以我们要看的是CIDR格式表示的子网斜线后的数字,只要在这个数字长度k下的网络含相同就是同一子网,简单来说就是看前k位数字是否相同(注意看的是二进制)L小于ans就将对应的r值和编号存进q如果q值不为空且对应的r值小于当前人数就将其删除,为后面下一个最小值腾位置,否则就先将编号存起来,再删除,最终得到的ans就是我们所求的值。第二行,一个整数n(1≤n≤1000),为需要判断的IP地址个数。

2026-05-14 20:53:58 581

原创 C++中vector和string的应用与区别

1.vector是什么:vector可以看成一个可以存所有数组并自动扩容的容器,简单来说就是vector就是可以自动变大、自动变小的数组,没有固定大小,装啥都行,特别灵活,所以我们一般可以用他去存先前不知道数组大小的任何东西。注意:我们在string中常用的v.length()不能在vector中使用,因为length()只能用于表示字符串的长度,但是vector是可变数组不一定只表示字符串。"ab" < "ba"(第一个字符 ASCII码'a'<'b',直接确定大小)(2).vector中内存连续。

2026-05-09 09:36:31 564

原创 快速幂(详细版)

如果我们要计算10的18,先用for循环尝试一下会发现我们的循环要运行1e18次,这显然不可能实现,但是如果我们该用快速幂就只需要运行60次左右。这就是指数幂最核心的思想,现在我们将去利用这个思想去解决时间超限。若想熟练应用快速幂我们首先要搞懂什么是位运算中的&和>>符号。这两个序号了解后我们来看一下快速幂最基本的核心代码。求 abmodm,数据范围:1≤a,b≤1018。3.若有1更新res的值为res*a%mod;我们一般也可以用x&1来判断x的奇偶性。5.先将a的值变为a*a%mod。

2026-05-07 15:22:55 299

原创 高精度加减法运算

对于我们经常碰见的题目来说数据范围一般不会超过long long的存储范围,所以当我们遇到有几十甚至上百位的加减法运算时就不能再用原来最基础的方法,否则计算机会报错或超时,所以遇到这类问题时我们只能用数组或字符串模拟手工竖式加减,这就是高精度算法。1.先将数字进行逆序存储(将个位数字存进数组的第一位,其他位数的数字以此类推)逐位相加:当前位和 = a[i] + b[i] + 进位。逐位相减:当前位差 = a[i] - b[i] - 借位。- 若不够减:差 += 10,借位设为1。3. 逐位相加,处理进位。

2026-04-29 18:56:48 476

原创 各种字符串在C语言中的读取问题和C++中的greater及less函数用法

1.最基本字符串读取:对于C语言来说最基础的字符串读取方法就是直接用scanf("%s",ch),但这种读取方法比较局限,不能读取空格和换行。注意:用fgets或getchar()都会读取换行,如果是没有换行的字符串记得用s[strcpy(a,"\n")]='\0'去除换行符。2.greater作用与less相反主要解决降序问题,greater<数据类型>(),这个函数一般与sort一起用。引言:这部分的知识点比较简单,但是在比赛中经常涉及,是字符串相关问题解决的基础,也有很多坑会让人踩。

2026-04-27 13:46:35 40

原创 C++中set入门级用法

1.概念:set是C++中STL标准库中中的关联式容器主要有排序和去重两大特点,在这两类问题上有极其广泛的应用。8.降序排序(set默认升序,如果想降序可用这样的代码)3.遍历set(用于输出去重和排序后的结果)(一)数组去重(直接插入set可自动去重)(三)快速查找(速度较快,一般不会卡时间)(二)排序加去重(用set可一步到位)5.判断元素是否存在用count()find()找不到会返回end()2.插入元素用insert()4.适合:去重、排序、快速查找。4.查找元素find()

2026-04-22 14:04:24 44

原创 C语言和C++字符串插入,删除及替换问题

1.概念:字符串插入简单来说就是将一个或一段字符插入到所给的字符串中,现将所需插入位置后的所有字符串向后挪对应的值,再把新内容放入字符串,最后更新字符串的长度即可。C++中的string会自动的去封装数组,所以不管插入删除还是替换都不需要再手动去控制字符串长度,这就比起C语言来说更加的方便快捷,且越界风险较低。1.概念:删除指定位置指定长度的字符,删完后要将后面的字符串前移,并在末尾手动补零。1.概念:查找字符长中应该被替换的旧字符串,将其删除然后插入新的字符串。

2026-04-20 14:11:09 63

原创 C++中map的讲解与应用

相当于 “名字 / 编号”,key不能重复,会自动排序。总结概括map就是通过建快速寻找到对应的值。三、map与unorderd_map的区别。:一个 key 对应一个 value。:通过 key 快速找 value、2.map最常见的用于代码的操作。:同一个 key 只能出现一次。:默认按 key 从小到大排序。(5)map代码完整简单示例。:对应的数据,可以随便改。1.基本头文件与定义写法。其中p.first指建;四、map概念及用法总结。p.second指值。原来的 value。

2026-04-13 14:55:19 63

原创 C语言结构体专题

1.总体概念:结构体是C语言的自定义复合数据类型,核心作用是将不同类型的变量封装成一个整体,用于描述一个具有多个属性的事物(如学生、商品、坐标),弥补了基本数据类型只能描述单一属性的不足,最常见的问题就是求解奖学金问题或者同时输出几个学生的学号以及最高成绩问题。2.本质:用户自定义的新数据类型,仅规定了“包含哪些成员、各成员是什么类型”,本身不占用内存,定义结构体变量时才会分配内存。成员类型 成员名2;3. 成员:结构体中的每一个变量(可是基本类型、数组、指针,甚至其他结构体),代表事物的一个属性。

2026-04-08 14:26:21 185

原创 贪心算法讲解与应用

1.贪心算法简单来说就是每一步都选当前看起来最好的,不回头、希望最后凑出全局最优解,一步一步做决定,不会回看过去的选择。2.钱币找零问题:解决这类问题的方法就是每次选用最大面额,当然这种方法有很大的限制,比如自定义的币值无法使用贪心。2.大问题的最优解一定包含小问题的最优解,比如最短路线上的任意两个点之间也一定是最短路径。动态规划:把所有的可能都算一遍,存起来,一定最优,但是最慢可能时间上会超限。(一)、活动选择问题:按结束时间顺序,每次选择最早结束且不冲突的活动。1.先把问题按时间、权重、币值等排序。

2026-03-30 20:23:07 59

原创 C语言或C++二分查找问题

1.概念:二分查找是一种高效的有序数组查找算法,核心思想是不断缩小查找范围:每次取中间元素与目标值比较,将查找范围缩小一半,直到找到目标或确定目标不存在。- 若 arr[mid] < target :目标在右半区,更新 left = mid + 1(很重要必须记得加1);- 若 arr[mid] > target :目标在左半区,更新 right = mid - 1(也很重要记得-1)。(1)查找的数组/容器必须是有序的(升序或降序,本篇博客以升序为例)。5. 循环结束未找到,返回-1(表示不存在)。

2026-03-28 10:00:00 64

原创 C语言或C++前缀和及差分数组的讲解与应用。

1.说明:前缀和简单来说就是预处理数组使其相加分为一维前缀和及二维前缀和,我们这篇博客先来讨论一维前缀和。说明:差分数组的使用离不开前缀和,是专门用来做区间快速修复的工具(如在一段区间内使每个数+x)。思路:子数组和等于s[r]-s[l-1]=k,即s[l-1]=s[r]-k。(一)题目:给定数组a[1.....n],多次询问区间[l,r]的和。多次问 [l,r] 和,不用每次遍历,直接前缀和 O(1)。这是前缀和最基本的公式可用于解决求l,u之间区间和的问题。区间修改用差分,最后求前缀和还原数组。

2026-03-23 13:46:58 67

原创 讨论C语言和C++在比赛时的时间、空间复杂度及数据范围的问题。

用大 O 符号(Big O Notation)表示,记作 O(f(n))其中n是输入规模(比如数组长度、数据量),f(n)是算法中。随输入规模增长的变化趋势,同样用大 O 符号(O(f(n)))表示,且 C 语言和 C++ 的分析逻辑完全通用。1<=n<=1e9等。- n ≥ 1e5 → 必须 O(n) 或 O(n log n)- 两层循环嵌套:O(n) × O(n) = O(n²):记作 O(f(n)),其中n是输入规模f(n) 是算法。- 两个循环并列:O(n) + O(n) = O(n)

2026-03-22 15:25:25 571

空空如也

空空如也

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

TA关注的人

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