自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 Codeforces Round 970 (Div. 3)(A~H)

codeforces round 970 div3 题解

2024-09-04 20:42:03 441

原创 牛客小白月赛99(A-F)

对于中间的墙壁,需要时机器人在墙壁之间来回移动,从而增加移动时间,增加爆炸伤害,有多种开启和关闭的方案,但是对于每一个大区间墙壁的操作增加的时间,都可以由小区间墙壁操作得到,只不过需要多操作几次。设 x 为答案,且 x 为合数,那么 ai 不整除 x,令 y 为 x 的质因子,因为 x 为合数,所以一定存在一个小于它的质因子。计算每一个牌倒塌的范围,按照左端点升序排列,然后区间合并,存储一下每一次能推倒的个数。所以可以先将所有的质数筛出来,并去除 ai,剩余的最小的质数即为答案。每一次增加的时间为 v。

2024-08-27 10:51:30 517

原创 最小生成树

Kruskal 和 Prime 的介绍;次小生成树和01规划问题

2024-08-26 16:55:51 176

原创 Floyd

转移方程:dist[k, i, j] = min(dist[k - 1, i, j], dist[k - 1, i, k] + dist[k - 1, k, j]。可以划分为两个子问题:经过 k 这个点和不经过 k 这个点。解决多源多汇的最短路,时间复杂度O(n^3)Flyd求最短路是基于动态规划实现的。集合 dist[k, i, j] 表示。,从 i 到 j 的最短路长度。dist 数组就是邻接矩阵。

2024-08-26 15:53:48 162

原创 Bellman_ford 和 SPFA

对于存在负权回路需要进行判断。当时,即使存在负权回路也是可以解的,但是那么就无解,答案为负无穷大。

2024-08-20 00:30:04 432

原创 Educational Codeforces Round 169 (Rated for Div. 2)(A-D)

为了不失一般性,设四种颜色分别为(a,b,c,d);城市 x 的颜色为(a,b),城市 y 的颜色为(c,d)(当两个城市不能直达)。设两个中转城市 A、B,为了保证能够中转,需要 A 和 B 中的颜色应该包括 x 和 y 中的至少一个颜色,并且 A 和 B 需可直达。设路径为 x -- > A -- > B -- > y,那么 A 中至少有一个颜色和 x 相同,B 中至少有一个和 y 相同。对于城市 z 的颜色情况,可以得到该种颜色情况的所有城市下标,并且是升序的(在预处理阶段,是从左往右遍历)。

2024-08-18 21:36:26 838

原创 Codeforces Round 966 (Div. 3) (A-F)

每一次加分都是行变满或者列变满导致的,可以动态规划求得任意一个矩阵,加分 [0, n*m] 的最小操作数。所以可以先预处理 n 个矩阵,val[i][j]:第 i 个矩阵分数为 j 所需的最小操作数。每次得到的分数是该区间的和,所以我们每次都尽可能选择靠近中间的区间。和从两端往中间靠依次得到的分数是相同的。可以对于 n*m 的网格中的每一个单元格求出被 k*k 的小方格覆盖的次数,利用。预处理好之后就可以转变为一个01背包的问题了:对于 n 个矩阵,每个矩阵选与不选,分数至少为 k ,最少操作数是多少。

2024-08-18 14:52:51 294

原创 搜索

给定一个整数 n𝑛,将数字 1∼n1∼𝑛 排成一排,将会有很多种排列方法。现在,请你按照字典序将所有的排列方法输出。共一行,包含一个整数 n𝑛。按字典序输出所有排列方案,每个方案占一行。1≤n≤7再介绍一种使用库函数next_premutation的方法这个函数的作用是会对给定的数组排列,默认按照升序,并且还会去重,当排列到最后一种之后,再排列就会返回false了。

2024-08-13 16:16:16 780

原创 动态规划

给定一个如下图所示的数字三角形,从顶部出发,在每一结点可以选择移动至其左下方的结点或移动至其右下方的结点,一直走到底层,要求找出一条路径,使路径上的数字的和最大。1≤𝑛≤500−10000≤三角形中的整数≤10000:将原本的三角形模型转换之后,下一层的第一个元素和最后一个元素(下一层为 i + 1层)会被本层的(第i层)第一个的前一个和最后一个的后一个干扰到,为了避免干扰就将数组全部预处理为还需要注意的一个点就是,本题要求的是顶点到底层的最大路径和,所以说需要遍历最后一层,取最大值。

2024-08-06 09:40:47 1085

原创 Dijkstra求最短路

但是第三步需要改变,在堆中并不能修改某个点,只能push,所以每次的时间复杂度为O(log n)。当是稠密图时,m = n^2,并没有起到优化作用,但是当m和n的范围一样,那么就可以起到优化作用了,所以在稀疏图时使用堆优化的Dijkstra。估算为:m的最大值为n^2。当题目给出的数据范围形式是n 和 m 分别给出,并且m的最大值约为n^2,这个时候表示给出的图为稠密图,使用邻接矩阵存储边权。当题目给出的数据范围 n 和 m 是相同的,那么使用邻接表,在加上一个数组存储边权即可。

2024-06-27 15:33:12 261

原创 用数组模拟堆

PS:: 当删除任意一个元素和修改任意一个元素时,当前这个位置的元素无非就是比之前的元素大或小或者相等,直接使用down和up;不需要进行判断,精简代码。4、删除任意一个元素 heap[k] = heap[size];也可以设堆顶的下标为0,但是左儿子下标为 2 * i + 1;使用数组模拟堆,堆顶的下标为1,左儿子下标为 2 * i;3、删除最小值 heap[1] = heap[size];1、插入一个数 heap[++size] = x;并且通过儿子下标找父亲下标有点麻烦:(i - 1) >> 1。

2024-06-20 20:32:42 220

原创 并查集

每次询问都将这一结点的父节点改为根结点。这样询问某一结点的树根(即询问该结点属于哪一集合),时间复杂度可以近似O(1)。每个集合用一颗树来表示,树根的编号就是整个集合的编号,每个结点存储它的父结点。比如:p[x] 表示 x 的父结点。每次寻找一结点的树根,也就是询问这个结点的集合,都需要依次向上遍历,这里可以采取。上面这一行代码表示:将a属于的集合的树根,链接到b属于的集合的树根下。p数组表示父结点,比如:p[x] 表示 x 的父结点。当 p[x] == x 时,表示 x 的父节点是树根。

2024-06-18 19:42:08 367

原创 Trie

Trie的作用:高效的存储和查找字符串。

2024-06-18 12:58:52 204

原创 排序加去重

返回的是一个迭代器,当然不止可以使用于vector。返回vector的不重复的区间的最后一个元素的下一个位置的迭代器。当然啦,使用这个函数的前提是对数组进行排序,这样才能达成去重+排序的效果。还可以使用unique函数进行去重。unique函数的模拟实现。可以使用STL容器set。

2024-06-16 23:24:14 81

原创 数组模拟栈和队列

qu数组存储队列的元素,head存储队头的下标,qt存储队尾的下标。stk数组存储栈中的数据,tt指向栈顶的元素下标。

2024-06-15 15:10:06 200

原创 数组模拟单链表和双链表

单链表主要有三个接口:头插,删除,插入(由于单链表的性质,插入接口是在结点后面插入)

2024-06-15 14:34:19 327

原创 前缀和

前缀和的作用是求一个数组中一段区间的和。

2024-06-11 13:32:58 269

原创 快速幂

将 b 转换为二进制来考虑,假如 b = 8;b 的二进制表示:1100;对应 8 4 0 0。给定整数 a b q, 求 a 的 b 次方 mod q。2、不能循环 b 次计算 a 的乘积,会超时。每计算一次 a 的乘积,就 mod q。根据题目数字取值范围,不能暴力处理。1、计算 a 的次方会超出范围。

2024-06-01 21:50:52 201

原创 红黑树

BLACK,RED,

2024-05-26 14:54:56 774

原创 AVL树

int _bf;// balance factor 平衡因子, _bf(0), _kv(kv){}

2024-05-25 10:55:38 490

原创 二叉搜索树(Binary Search Tree)

K _key;

2024-05-23 14:28:11 308

原创 多态

1、必须通过基类的指针或者引用调用虚函数2、子类必须对基类的虚函数进行重写概念对比重载1、两个函数在同一作用域2、函数名相同;参数有三不同(顺序不同or类型不同or数量不同)重写(覆盖)1、两个函数分别在基类和子列的作用域2、函数名/参数/返回值都必须相同(协变例外)3、两个函数必须是虚函数重定义(隐藏)1、两个函数分别在基类和子列的作用域2、函数名相同3、基类和子类的两个同名函数不是构成重写就是重定义。

2024-05-19 22:29:30 1677

原创 继承

public继承是一种is-a的关系。也就是说每个派生类对象都是一个基类对象组合是一种has-a的关系。假设B组合了A,每个B对象都有一个A对象。继承是一种白箱复用,父类对于子类基本是透明的,但是它一定程度破坏父类封装组合是一种黑箱复用,A对B是不透明的,A保持着它的封装组合的类耦合度更低,继承的类是一种高耦合面试题:使用继承还是组合呢?答:不能一概而论,根据使用场景,符合is-a就使用继承,符合has-a就使用组合,都符合就优先使用组合。

2024-05-17 19:15:28 829

原创 动态规划题集

本文是关于动态规划章节的题集,题目由浅到深,只有自己做过才能体会到。

2024-05-13 21:36:52 721

原创 list

T _data;

2024-05-13 13:47:12 250

原创 vector

注意:使用resize接口时,val是一个缺省的,默认给vector元素的初始值。当改变的size小于原本的size,那么直接截断多余的部分;当改变的size大于原本的size,那么多余的部分用val的值填充;当改变的size大于原本的capacity,那么会对原本的vector进行扩容操作。具体文档如下:reseve开辟空间在vs下capacity是按照1.5倍进行增长的,g++是按照2倍进行增长的。2倍增长时间效率更优,但可能会造成空间上的浪费(相对于1.5倍增长)。不需要纠结具体多少倍比较合适,按照实

2024-05-10 19:25:35 1650

原创 string

2、resize(size_t n) 与resize(size_t n, char c)都是将字符串中的有效字符个数改为n个,第二个实参默认为0。假如n的大小大于原来的底层空间,那么就会扩容到n,复制原来的字符串,多余的空间用第二个实参填充。假如小于原来的大小,那么就截取多余的字符,但是底层的空间并不会缩小。3、reserve(size_t res_arg = 0 ):为string预留空间,不改变有效元素个数,当实参小于原底层空间大小时,也不会改变容量大小。('\0'不是有效字符)

2024-05-08 15:23:36 543

原创 模板

在C语言中,想要实现多种类型的变量交换,需要用户定义需要实现交换的类型的函数。用户自定义一个栈的数据结构,只能用于一种类型的使用,如果想要在一个程序中定义多种类型的栈,C语言是办不到的。那么在C++中就引入了模板。

2024-05-03 15:14:09 886

原创 内存管理

int main()// malloc和new最大区别就是new会调用构造函数,free和delete的最大区别就是delete会调用析构函数。// p1是一个整型指针,存储在栈区,p1存的内容是一个指针,该指针指向在堆区开辟的内容。free(p1);delete p2;return 0;

2024-05-03 14:24:59 746

原创 单调栈

单调栈就是用来存放已经遍历过的元素。当解决问题需要记录前面的元素,这个时候就需要用到单调栈。比如求一个数组中一个元素后面第一个大于它的元素。可以使用暴力去遍历,但是会出现重复判断,性能不优。这个时候用一个单调栈来存放已经遍历过的元素。这样来看我们可知根据题目要求,单调栈里面可以存放元素的下标也可以存放元素值。

2024-04-30 22:33:08 120

原创 图论题集

给定一个graph,题目要求从结点0到n - 1的结点的所有路径。这个n指的是graph的行下标。拿一组测试用例来说明吧。不然不好理解题意题目大致就是这么个意思。题目保证了输入为有向无环图。那么就可以确定,一定会有结点0到n的路径。这很辛苦,但我觉得对于初学者来说,很有必要。一步一步分析递归和回溯,这样才能更好的理解dfs。多分析个几次,就回慢慢变快了。

2024-04-30 22:32:33 223

原创 类和对象

1、声明和定义全部放在类体中(注意:成员函数在类中定义,编译器可能会当初。

2024-04-25 17:55:59 400

原创 内联函数、auto关键字、范围for、nullptr

将一个函数指定为内联函数,通常就是将它在每个调用点上“内联地”展开。这样就没有函数调用建立栈帧的开销,可以提升程序运行的效率。一般来说,内联机制用于优化规模较小(即函数不是很长,没有具体的说法,取决于编译器内部的实现)、流程直接、频繁调用的函数。inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使目标文件变大,优势:少了调用开销,提高程序运行效率。

2024-04-24 13:42:04 240

原创 排序

选择排序是寻找数组中的最大值(最小值)的下标,然后交换。当然我们可以优化一下,上面原始做法是找最大值,其实我们可以分区间去找最小和最大,然后把最小值和该区间第一个数交换,最大值和该区间最后一个交换。但是这样写会存在一个问题,就是当maxi的位置和begin的位置相同,mini的问题和end的位置相同,那么就会重复交换,相当于两次交换的同样的位置,那么没有起到交换的作用。

2024-04-18 21:23:35 383

原创

堆分为大根堆和小根堆。堆的结构是一颗完全二叉树。大根堆是父结点大于孩子结点。小根堆是父结点小于孩子结点。这就是一个小根堆这是一个大根堆。

2024-04-17 22:34:15 427 1

原创 贪心题集

这道题就是要求给定的数组中的峰值数以及端点。把数组抽象成折线图会好理解一些,那么根据题意,我们就需要判断这些相邻的数的差值,不妨设pre_diff = nums[i] - nums[i - 1],cur_diff = nums[i + 1] - nums[i]。那么出现峰值的条件为那么就需要三个数来计算,但是数组假如就只有两个数呢?我们在数组的第一个元素之前引入一个相同的数,所以在开始状态pre_diff = 0。那么就需要修改判断峰值条件了这样就包括了只有两个元素的情况。

2024-04-03 20:07:48 642 1

原创 运算符重载

当我们想进行两个自己创建的类比较时,这个时候" == "不会起作用了,因为这个符号是当我们比较基本内置数据时,系统已经给我们封装好了,可是我们自己创建的类型,系统可没有封装好,所以就需要运算符重载。

2024-04-03 10:03:13 128 1

原创 缺省函数,函数重载,引用

缺省函数又分为全缺省函数和半缺省函数。

2024-04-02 13:21:08 1084 1

原创 内存的四区

内存分为四个区,分别是:代码区、全局区、栈区、堆区。一个程序在运行前分为代码区和全局区,这个时候栈区和堆区还没有创建。

2024-04-01 22:50:37 176

原创 二叉树的前中后序遍历(递归法和迭代法)

三种遍历的递归大差不差,但迭代却有区别,那么在下一期将会更新三种遍历的迭代统一格式。

2024-03-20 21:32:29 378 1

空空如也

空空如也

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

TA关注的人

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