自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 2023CCPC哈尔滨站

2023CCPC哈尔滨站。

2024-06-04 22:22:42 496

原创 pair的基本用法总结

pair包含两个数值,与容器一样,pair也是一种模板类型。类模板:template<class T1,class T2> struct pair。因为是使用struct不是class,所以可以直接使用pair的成员变量。在创建pair对象时,必须提供两个类型名,两个对应的类型名的类型不必相同。另一个应用是,当一个函数需要返回2个数据的时候,可以选择pair。这一对值可以具有不同的数据类型(T1和T2),参数:T1是第一个值的数据类型,T2是第二个值的数据类型。当需要这样的需求时就可以使用pair。

2024-06-02 21:13:18 416

原创 【C++】ios::sync_with_stdio(false) 与 cin.tie(nullptr) 加速 IO

之前写题遇到大数据量(cin、cout 数据量级达到 1e5、1e6 ),因为考虑 IO 性能报错 TLE,故选择 scanf、printf 替代 cin、cout,以解决问题。一直以来没有深入研究其中原因,只知关键词——同步,虽是本质但差之千里,今究其因,记录本文。

2024-06-02 12:29:16 435

原创 string及其常见函数

find_first_of()方法在字符串中查找参数中任何一个字符首次出现的位置。当 cin 读取数据时,它会传递并忽略任何前导白色空格字符(空格、制表符或换行符)。一旦它接触到第一个非空格字符即开始阅读,当它读取到下一个空白字符时,它将停止读取。为了解决这个问题,可以使用一个叫做 getline 的 C++ 函数。此函数可读取整行,包括前导和嵌入的空格,并将其存储在字符串对象中。

2024-06-02 12:22:41 139

原创 单调栈--

更直白来说,就是用一个栈来记录我们遍历过的元素,因为我们遍历数组的时候,我们不知道之前都遍历了哪些元素,以至于遍历一个元素找不到是不是之前遍历过一个更小的,所以我们需要用一个容器(这里用单调栈)来记录我们遍历过的元素。那么单调栈的原理是什么呢?为什么时间复杂度是O(n)就可以找到每一个元素的右边第一个比它大的元素位置呢?,因为在遍历的过程中需要用一个栈来记录右边第一个比当前元素高的元素,

2024-05-28 22:33:23 324

原创 运算符重载

运算符重载是对已有的运算符赋予多重含义,使同一个运算符作用于不同类型的数据时做出不同的行为。例如:学生类包括姓名,年龄,班级,成绩等,定义了两个学生变量,想比较它们的大 小,如何比较大小呢?为“学生”类重载“>”符号,然后在这个方法里实现比较的意义:按年龄、按成绩或按姓名首字母比较等。

2024-05-27 20:25:35 473

原创 卡特兰数-

卡特兰数是一个数列,其前几项为(从第零项开始) : 1, 1, 2, 5, 14, 42, 132, 429, 1430, 4862, 16796, 58786, 208012, 742900, 2674440, 9694845, 35357670, 129644790, 477638700, 1767263190, 6564120420, 24466267020, 91482563640, 343059613650, 1289904147324, 4861946401452, …

2024-05-26 18:55:43 349

原创 new用法详解

1.new是一个关键字,用于开辟空间,开辟的空间在堆上,而一般声明的变量存放在栈上;2.new得到的是一段空间的首地址。所以一般需要用指针来存放这段地址//返回new出来这块内存的地址//用一个指针去接受这个地址//返回内存空间地址00995B08//返回初始值10delete p;3.开辟的内存空间需要记得delete掉,否则会造成内存泄漏!delete p的时候:首先调用这个对象的析构函数,然后释放这个对象的空间。

2024-05-25 20:12:11 354

原创 c++类和对象

上方定义中的public,protected,private,即为访问修饰符。需要注意的是:在结构体struct中,不进行声明的话,内部成员默认为公有的,及程序内任意函数都可调用其内部成员。而在类class中,如果不进行声明,则默认为私有成员,即仅允许本类成员函数或友元中函数进行访问。double c;y = b;cout

2024-05-21 21:23:06 425

原创 c++基础篇

1.2.1命名空间的定义要用到一个关键字就是namespace加命名空间的名字,然后接一个{ },里面就是命名空间的成员。//这我定义一个名字为xiaoming//可以定义变量也可以定义函数// 同时可以进行嵌套namespace hello // 嵌套在命名空间xiaoming的命名空间hello// 不同命名空间里的名字可以相同3.1.1缺省参数是声明或定义函数时为函数的参数指定一个缺省值。在调用该函数时,如果没有指定实,参则采用该形参的缺省值,否则使用指定的实参。

2024-05-21 19:43:49 625

原创 仿函数介绍

仿函数就是假函数,它是把对象当作函数使用,所以也称为函数对象。就比如我们这里优先级队列控制这个大堆小堆,我们之前实现过堆,我们知道控制大堆小堆其实就是就是控制里面元素的比较方式不同。C++其实本质搞出这个东西是因为函数指针太复杂了,而仿函数在很多场景能达到一个替代函数指针的作用。那要告诉大家的是仿函数它的作用和价值还是很大的,不过我们现在还不能很好的体会到。那我们上面用到的greater包括默认给的less其实就是库里面提供的仿函数。当然不是只能传仿函数,我们看到它给的是一个模板。

2024-05-20 21:09:19 246

原创 C++ 优先队列 priority_queue 使用篇

在上面的代码中,我们定义了一个名为CompareByAge的结构体,重载了函数调用运算符operator(),按照Person对象的age成员进行比较。然后,我们将CompareByAge作为优先队列的仿函数类型,并插入3个Person对象到优先队列中。如果需要对特定元素进行操作,通常需要先将其取出,然后再进行操作,最后再将其放回优先队列中。中的元素构造成堆的结构,所以其实我们就可以把它当作堆,凡是需要用堆的位置,都可以考虑优先队列。你可以使用不同的仿函数来改变元素的排序方式。作为底层存储数据的容器,在。

2024-05-18 22:44:07 620

原创 栈和队列-

队列是先进先出,栈是先进后出。首先大家要知道栈和队列是STL(C++标准库)里面的两个数据结构。栈提供push和pop等等接口,所有元素必须符合先进后出规则,所以栈不提供走访功能,也不提供迭代器(iterator)。不像是set或者map提供迭代器iterator来遍历所有元素。栈是以底层容器完成其所有的工作,对外提供统一的接口,底层容器是可插拔的(也就是说我们可以控制使用哪种容器来实现栈的功能)所以STL中栈往往不被归类为容器,而被归类为container adapter(容器适配器)。

2024-05-16 21:43:13 421

原创 哈希表Hash table

哈希表是根据关键码的值而直接进行访问的数据结构。数组就是⼀张哈希表。例如要查询一个名字是否在这所学校里。要枚举的话时间复杂度是O(n),但如果使用哈希表的话,只需要O(1)就可以做到。我们只需要初始化把这所学校里学生的名字都存在哈希表里,在查询的时候通过索引直接就可以知道这位同学在不在这所学校里了。

2024-05-12 21:09:08 1307

原创 C++ sort()排序详解

上面我们说到sort()函数可以自定义排序准则,以便满足不同的排序情况。使用sort()我们不仅仅可以从大到小排或者从小到大排,还可以按照一定的准则进行排序。比如说我们按照每个数的个位进行从大到小排序,我们就可以根据自己的需求来写一个函数作为排序的准则传入到sort()中。然后我们将这个cmp函数作为参数传入sort()中即可实现了上述排序需求。i<10;i++){}//输出结果:59 99 96 65 44 13 33 72 21 80return 0;

2024-05-10 22:55:57 447

原创 C++迭代器

要访问顺序容器和关联容器中的元素,需要通过“迭代器(iterator)”进行。迭代器是一个变量,相当于容器和操纵容器的算法之间的中介。迭代器可以指向容器中的某个元素,通过迭代器就可以读写它指向的元素。从这一点上看,迭代器和指针类似。

2024-05-10 21:27:40 741

原创 STL 标准模板库

vectorlistsetmapstackqueueSTL提供了丰富的算法库,包括排序、搜索、复制、替换、合并等各种常用算法。这些算法可以用于不同类型的容器,使得对数据进行各种操作变得简单高效。

2024-05-03 15:17:56 1074

原创 二叉树理论和题目

在我们解题过程中二叉树有两种主要的形:满二叉树和完全二叉树。

2024-04-28 20:46:43 570

原创 微信小程序的开发

utils 用来存放工具性质的模块(例如:格式化时间的自定义模块)app.wxss 小程序项目的全局样式文件project.config.json 项目的配置文件sitemap.json 用来配置小程序及其页面是否允许被微信索引。

2024-04-27 21:34:59 402

原创 gets函数

可见,gets() 函数不仅比 scanf 简洁,而且,就算输入的字符串中有空格也可以直接输入,不用像 scanf 那样要定义多个字符数组。前面从键盘输入字符串是使用 scanf 和 %s。其实还有更简单的方法,即使用 gets() 函数。gets() 函数的功能是从输入缓冲区中读取一个字符串存储到字符指针变量 str 所指向的内存空间。gets函数,C语言gets函数详解。请输入字符串:i love you。

2024-04-22 20:47:50 155

原创 ST表的解释

ST

2024-04-08 21:44:10 182

原创 树状数组相关题目

归并分治实现:无需离散化代码、使用空间少、常数时间优良,不能实时查询,只能是离线的批量过程。树状数组实现:需要离散化代码、使用空间多、常数时间稍慢,可以实时查询。因为词频数组的长度是由原数组最大值决定的,可能会出现过大的情况。因此我们只要统计小于2的数,在词频数组中的和即可。将原数组按照从小到大的顺序填入help数组中。再对此时的arr数组进行词频统计建立树状数组。然后通过help数组对arr数组进行修改。这时,我们就可以把词频数组转为树状数组。因为arr数组中最大的数字为100。我们假设一个数组arr。

2024-04-02 21:25:41 347

原创 归并排序和分治

归并排序是利用的思想实现的排序方法,该算法采用经典的策略(分治法将问题成一些小的问题然后递归求解,而的阶段则将分的阶段得到的各答案"修补"在一起,即分而治之)。可以看到这种结构很像一棵完全二叉树,本文的归并排序我们采用递归去实现(也可采用迭代的方式去实现)。归并排序算法有两个基本的操作,一个是,也就是把原数组划分成两个子数组的过程。另一个是,它将两个有序数组合并成一个更大的有序数组。

2024-04-02 14:50:21 340

原创 Master公式(计算递归复杂度)

公式解释:n表示问题的规模,a表示递归的次数也就是生成的子问题数,N/b表示子问题的规模。O(N^d)表示除了递归操作以外其余操作的复杂度。

2024-04-01 11:12:18 245

原创 高精度算法——高精度除法

ans = (ans * 10 + a[i]) % b 这个就是求余数,因为一开始是没有余数的,所以就直接是a[i] 求余,但是如果是进行到,下一步了,就是用12 除了,这是就很有必要写上 ans * 10,不然就是用 2 求余,这不就出错了嘛,这一步就是求余的过程。先来看下c[i] = (ans * 10 + a[i]) / b , 就用上面的例子说明,先是1 除 b ,刚开始的没有余数,所以 ans * 10,就没什么用,就只是用 a[i] 除 b ,1 除 4 不能整除所以就是零,

2024-03-25 20:38:13 248

原创 拼接字符串,得到字典序最小的结果

拼接字符串,得到字典序最小的结果_字符串拼接字典序最小-CSDN博客。

2024-03-25 20:26:06 193

原创 最小生成树

这仅仅是生成一棵树,当图中每条边都存在权重时,这时候我们从图中生成一棵树(n - 1 条边)时,生成这棵树的总代价就是每条边的权重相加之和。

2024-03-23 23:22:43 728

原创 数位dp·

数位dp的尝试并不特殊,绝大多数都是线性展开,类似于从左往右的尝试数位dp时在数字的每一位上进行线性展开解题的核心在于:可能性的整理,排列组合。

2024-03-20 20:14:56 134

原创 状压dp·

状压 dp 又叫集合动态规划。是以结合信息为状态的特殊的动态规划的问题。主要有和的动态规划状压dp设计一个整型可变参数status,利用status的位信息,来表示:某个样本是否还能使用,然后利用这个信息进行尝试写出尝试的递归的函数 -> 记忆化搜索 -> 严格位置的动态规划 -> 空间压缩等优化如果有k个样本,那么表示这些样本的状态,数量为2^k样本每增加一个,状态的数量是指数级增长的,所以状压dp能解决的问题往往数据量不大一般样本数量在20个以内。

2024-03-18 17:59:24 167

原创 区间dp-

间dp就是在区间上进行动态规划,求解一段区间上的最优解。主要是通过合并小区间的最优解进而得出整个大区间上最优解的 dp 算法。既然让我求解在一个区间上的最优解,那么我把这个区间分割成一个个小区间,求解每个小区间的最优解,再合并小区间得到大区间即可。所以在代码实现上,我可以枚举区间长度len为每次分割成的小区间长度(由短到长不断合并),内层枚举该长度下可以的起点,自然终点也就明了了。然后在这个起点终点之间枚举分割点,求解这段小区间在某个分割点下的最优解。

2024-03-05 19:50:39 306

原创 单调队列的使用

单调队列其实就是一个队列,只是使用了一点巧妙的方法使得队列中的元素全都是单调递增(或单调递减)的单挑队列主要解决以下问题:滑动窗口在滑动时,r++代表右侧数字进入串口,l++代表左侧数字出窗口这个过程中,想随时得到当前滑动窗口的。

2024-03-05 15:34:57 790

原创 并查集详解

在并查集中,用于查询各自的根节点的函数就是我们的find()函数。find(x)的作用是用于查找某个给定的点x,返回其所属集合的代表。实现:首先我们需要定义一个数组:int pre[1000];(数组长度依题意而定)。这个数组记录了每个人的父节点是谁。这些人从0或1开始编号(依题意而定)。比如说pre[16]=6就表示16号的父节点是6号。如果一个人的父节点就是他自己,那说明他就是根节点了,查找到此结束。每个人都只认自己的父节点。要想知道自己根节点的名称,只能一级级查上去。

2024-02-28 21:40:35 933

原创 线段树和线段数组

因为如果对于 1 ∼ 4 这个区间,你把 1 ∼ 3 区间 + 1,相当于把节点 1 ∼ 2 2和 3标记,但是如果你查询 2 ∼ 4时,你会发现你加的时候,把没有标记的 2 节点和没有标记的 3 ∼ 4 节点加上去,结果当然是错的。到了 3 ∼ 4 区间,我们发现她并没有完全包含在答案区间 1 ∼ 3 里面,但发现她的左儿子 3 ∼ 3 区间和 1 ∼ 3 区间又交集,那么久走到 3 ∼ 3 区间。因为 1 ∼ 4 的和就是等于 1 ∼ 2 的和与 2 ∼ 3的和的和。

2024-02-27 14:30:56 1172

原创 前缀和与差分

例题:先预处理出二维前缀和,然后枚举所有的正方形,并且所有正方形的边长为小于min(n ,m)

2024-02-27 13:05:40 184

原创 全面理解网络流中的最大流问题

有向网络首先,我们要做的就是将实际问题抽象。以上面铁轨网络为例子,如何抽象火车网络成为一种数学模型?噢,即便你没有学过图论,凭借直觉你也能想到。车站可以作为点,铁轨作为线,然后用线把点连起来,这样不就是表示出火车网络了吗?是的,你想没错。不过你还可以想的更深——火车的行驶当然有方向,尤其是在我们想要求解特定两点之间的情况下,所以作为铁轨的线应该改成向量。而这就是有向图容量网络有了,流呢?不要着急,我们在建立流的概念之前还有一些东西需要确定下来。

2024-02-25 20:33:10 1118

原创 二分图匹配详解

找到这样的路径过后,显然路径里没有被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。通过数代人的努力,你终于赶上了剩男剩女的大潮,假设你是一位光荣的新世纪媒人,在你的手上有N个剩男,M个剩女,每个人都可能对多名异性有好感如果一对男女互有好感,那么你就可以把这一对撮合在一起,现在让我们无视掉所有的单相思,你拥有的大概就是下面这样一张关系图,每一条连线都表示互有好感。与1号男生相连的第二个女生是2号女生,

2024-02-25 14:45:27 786

原创 素数筛法详解:埃氏筛和欧拉筛

素数筛法详解:埃氏筛和欧拉筛-CSDN博客。

2024-02-23 21:05:09 148

原创 博弈论的理论和题目

博弈论问题大致分为,公平组合游戏、非公平组合游戏(绝大多数的棋类游戏)、反常游戏只需要关注公平组合游戏,反常游戏是公平组合游戏的变形。以下为公平组合游戏的特征:1.两个玩家轮流行动且游戏方式一致。2.两个玩家对状况完全了解3.游戏一定会在有限步数内分出胜负4.游戏以玩家无法行动结束一共有n颗石头,两个人轮流拿,每次可以拿1~m颗石子,拿到最后一颗石子的人获胜,根据n,m,返回谁赢。分析:显然,如果 n = m + 1那么由于一次最多只能取 m 个物品,所以无论先取者拿走多少个,后取者都能够一次拿走剩余的物品

2024-02-22 16:15:59 1215

原创 对数器打表找规律

通常我们在笔试的时候或者参加编程大赛的时候,自己实现了一个算法,但是不能够判断该算法是否完全没问题,如果在比赛平台上验证,通常只会告诉你有没有错误,出了错不会告诉你哪里有问题,对于排错来说是非常坑爹的,所以对数器就横空出世了,,如果你的算法是没问题的,那么和对数器的这个百分之百正确的方法一个元素一个元素的比较,也一定是equals的。如果返回false,说明你的算法有问题。

2024-02-20 13:39:15 846

原创 图论的理解和应用

图是一个二元组G = ( V ( G ) , E ( G ) )其中是非空集,称为以下为主要的图。

2024-02-18 10:47:22 423

空空如也

空空如也

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

TA关注的人

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