12 2023 档案
摘要:字符串匹配是计算机中的一个基本问题。字符串匹配应用很广泛,比如你想在一篇文章中找到某个关键字所在的位置,或者是你想在一份名单中找到某个名字是否出现等等。 抽象描述起来,就是我们现在有一个长度为 n 的字符串S,称为主串,有一个长度为 m 的字符串P,称为模式串。我们如何找到模式串在主串中存在的位置呢
阅读全文
摘要:什么是栈和队列 栈(stack),是一种"后进先出"(Last In First Out,LIFO)的线性表,其限制是只允许在表的一端进行插入和删除运算。比如往桌子上放盘子,往上放盘子(压栈)后,只能从最上面(栈顶)取盘子(弹栈)。 队列(queue),是一种"先进先出" (First in Fir
阅读全文
摘要:本来要先讲数组的,介于之前已经总结过可变数组vector了,故不再开一个专题去介绍用法和原理。但是要提一嘴: 数组作为数据结构可以高效地存储和查询给定索引(下标)的数据,其时间复杂度均为O(1),因为这个性质,数组可以用来模拟其他很多数据结构,但是如果要将整个数组进行移位操作,例如在中间插入和删除数
阅读全文
摘要:先来复习一下&,|,^,~这四个位运算符号吧! (与)&: 0&0=0 1&0=0 0&1=0 1&1=1 (或)|: 0|0=0 1|0=1 0|1=1 1|1=1 (异或)^: 0^0=0 1^0=1 0^1=1 1^1=0 (取反)~: ~1=0 ~0=1 分析: 8的二进制是1000,7的二
阅读全文
摘要:n进制转换为m进制(2 <= n,m <= 16) #include<iostream> #include<string> using namespace std; int CharToInt (char a) { //字母转数字 return '0'<=a && a<='9' ? a-'0':10
阅读全文
摘要:lowbit的概念 我们知道,任何一个正整数都可以被表示成一个二进制数。如: (2)10=(10)2 (4)10=(100)2 那么定义一个函数f(x) = lowbit(x),输入一个十进制数,返回二进制中最低一位的1所表示的值,如lowbit(4)=4 先了解原码 补码 反码 原码:是最简单的机
阅读全文
摘要:太难啦ww https://www.acwing.com/solution/content/147257/
阅读全文
摘要:直接看代码和注释吧qwq高精度就是模拟嘛ww 还是python好,自带高精度 #include<bits/stdc++.h> #define MAXN 10500 using namespace std; string a, b; //选择字符串。因为字符串储存了每个串的长度,可以直接调用。 int
阅读全文
摘要:和A+B problem类似 ,不多说,直接看代码和注释就好啦!ww 感觉这东西只要有个概念就行了...就是在练模拟?www其他语言似乎有大数加减乘除? 这样的高精度算法时间复杂度O(n2),n是数字位数,如果位数过大还是很慢。可以利用快速傅里叶变换的方式加速高精度乘法。(虽然都是我连傅里叶级数都没
阅读全文
摘要:“高精度”是怎么一回事? 简单来说,就是我们计算的数字太大太大了,导致已经超出了我们可以定义的范围,以至于我们不能用正常的定义来定义和计算数字,不然只能计算我们能所容纳的数字部分,无法达到要求。 比如longlong可以定义的范围在 -(2的63次方)到 2的63次方-1 如果此时数据过大,超过了l
阅读全文
摘要:#include <vector> 连续的顺序的储存结构(和数组一样的类别),但是有长度可变的特性。 构造 vector<类型> arr(长度, [初值]) 时间复杂度:O(n) 常用的一维和二维数组构造示例,高维也是一样的(就是会有点长)。 vector<int> arr; // 构造int数组
阅读全文
摘要:还记得A-B=C问题吗?在之前,我们把原序列排好序,然后变成A=B+C问题,枚举每一个元素作A,然后再序列里如果存在B+C,必然是连续的一段(一个也是),我们利用二分法以O(logN)的时间复杂度获得左右边界相减即可。现在介绍另一种方法:双指针法。 如上面说的,序列里如果存在B+C,必然是连续的一段
阅读全文
摘要:P1496 火烧赤壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 我们首先先看数据,n<=20000,数据不多,但是范围大(-10^9<=Ai,Bi<=10^9),这时,就可以用离散化了。但是在这里我们会遇到区间重合的问题(也可以使用区间合并),如下图 本题的题意是让我们求出燃
阅读全文
摘要:遇到大数据量(cin、cout 数据量级达到 1e5、1e6 ),因为考虑 IO 性能会报错 TLE,一般选择 scanf、printf 替代 cin、cout 但是加上这两段代码,它们之间的速度就相差无几了 ios::sync_with_stdio(false); cin.tie(nullptr)
阅读全文
摘要:在一些场景或题目中,常常会遇到数据跨度较大的一堆数据。如果需要用连续空间存储,则会有大量空闲的空间,并且遍历的时间复杂取决于最大和最小值的间距。 如果不关系数据的具体大小,只关心数据的相对顺序。离散化,就是当我们只关心数据的大小关系时,用排名代替原数据进行处理的一种预处理方法。离散化本质上是一种哈希
阅读全文
摘要:## 题目描述 世博会志愿者的选拔工作正在 A 市如火如荼的进行。为了选拔最合适的人才,A 市对所有报名的选手进行了笔试,笔试分数达到面试分数线的选手方可进入面试。面试分数线根据计划录取人数的 划定,即如果计划录取 名志愿者,则面试分数线为排名第 $m \times 150\
阅读全文
摘要:pair简介: pair 是一个很实用的"小玩意",当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用 pair 可以很方便地作为一个代替品。 pair 实际上可以看作一个内部有两个元素的结构体,且这两个元素的类型是可以指定的,如下面的短代码所示 struct pair { t
阅读全文
摘要:在STL提供的 algorithm 头文件中,提供了两个函数:upper_bound 和 lower_bound ,这俩函数功能 ”类似“,但并不相同。 lower_bound(begin,end,val)在有序的数组连续地址的[begin,end)内找到第一个位置并返回其地址,使得val插入这个位
阅读全文
摘要:问题引入:洛谷P2367 班上一共n个学生,语文老师需要对成绩进行p次修改,每次修改需要给第x个学生到第y个学生每个人增加z分,语文老师想知道修改成绩后的最低分。 对于 的数据,有 。 对于 的数据,有 。 对于 $80\%
阅读全文
摘要:插入排序是一种最简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。 算法步骤: 将第一个数组元素视为有序元素,后面的数组元素视为一段无序序列。 从第二个元素开始,每个元素一直和前面的元素比较,如果待插元素比正在比较的元素小,那么把有序
阅读全文
摘要:刚学C++时书上就会写这个qwq属于最简单的排序算法惹。时间复杂度O(n2)。 算法步骤 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。 针对所有的元素重复以上的步骤,除了最后一个。 持续每次对
阅读全文
摘要:选择排序(Selection sort)是一种简单直观的排序算法。 1. 基本思想 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的思想其实和冒泡排序有点类似,都
阅读全文
摘要:引入:P1271 【深基9.例1】选举学生会 在实际中,一般会在投票区放n个投票箱,投完后只需要计数每个投票箱即可。就此可引入计数排序。 本题AC代码(虽然这题直接sort就行了...) #include<iostream> using namespace std; int a[1010]={0},
阅读全文
摘要:归并排序,它有两大核心操作. 一个是将数组一分为二,一个无序的数组成为两个数组。 另外一个操作就是,合二为一,将两个有序数组合并成为一个有序数组。 时间复杂度情况: 最好和最快情况都是:O(NlogN) 代码模版如下 int arr[N], temp[N]; void merge_sort(int
阅读全文
摘要:快速排序 基本思想 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。 算法复杂度 最差时间复杂度O(N2)平均时间复杂度O(NlogN) 实现方法
阅读全文
摘要:题目描述在这里:P1678 这道题用二分的思路就很容易想出,先把学校分数排好序,根据不满意度的定义,我们只需要每次找到第一个大于学生成绩的学校分数,然后再和最后一个小于学生分数的院校分数分别与学生成绩做差再打绝对值进行比较,取最小的一个累加到ans里就好啦 代码如下 #include<iostrea
阅读全文
摘要:题目描述见此:P1024 如何求一个方程的根呢qwq 首先,根是什么,函数y=f(x)有零点 ⇔ 方程f(x)=0有实数根 ⇔ 函数y=f(x)的图象与x轴有交点。回顾我们高一学过的一个定理: 零点存在性定理: 如果函数y=f(x)在区间[a, b]上的图象是连续不断的一条曲线,并且有f(a)·f(
阅读全文
摘要:题目描述见:P1873 思路比较明确qwq因为答案显然满足单调性:当x超过某个数一定是错的(收集的木材大于m),而小于x一定是对的,并且x是从0一直递增。故我们只需二分法找到x。 直接看代码吧qwq精髓是check函数直接模拟题目要求ww #include <iostream> using name
阅读全文
摘要:题目描述见:P1102 qwq大致思路是将A-B=C变成A=B+C,其中C是确定的,并且题目说重复的也算ww(如果需要不重复的话开两个数组,给其中一个数组去重就行了qwq)那么在数组有序的情况下只需要枚举数组中的每一个数,然后用二分来找存在几个B+C,因为数组有序所以B+C一定是连续的,故寻找第一个
阅读全文
摘要:1. 简介故事分享🏬: 有一天小明到图书馆借了 N 本书,出图书馆的时候,警报响了,于是保安把小明拦下,要检查一下哪本书没有登记出借。小明正准备把每一本书在报警器下过一下,以找出引发警报的书,但是保安露出不屑的眼神:你连二分查找都不会吗?于是保安把书分成两堆,让第一堆过一下报警器,报警器响;于是再
阅读全文