一、基础算法
文章平均质量分 74
位运算、二分、前缀和、差分、位运算、离散化、区间合并、双指针
孤魂233
这个作者很懒,什么都没留下…
展开
-
倍增与ST表
我们规定:f[i][j]表示:从i开始向后,长度为$$2^j$$区间中的最大值如果我们想求f[i][j],我们可以把区间均分为2部分2部分区间长度为2^(j - 1),第二个区间的起点就是:我们预处理完之后,我们改如何查询?如图假设我们要求[L, R]区间的最大值,区间长度为len,则我们能找到一个最大的k,使得:即:则有如图:中间虽然有重复,但是由于我们求的最大值,就算重复比较但是并不会改变结果具体到转移方程如下:至此,我们就学习完了。原创 2024-07-20 21:57:45 · 554 阅读 · 0 评论 -
区间合并算法
常见类型是给我们n个区间,每个区间都符合性质,区间之间可能有交集,我们有时需要把相交区间合并,方便后续统计和计算。P1496 火烧赤壁 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)本题就是给了n个区间,让你统计总着火长度,由于总距离给的很大,如10^9,我们不能直接开一个数组,这里也用到了一些离散化的知识,把每个区间存下来,按左端点从小到大排序。由于区间之间可能有重复,所以想到了区间合并,合并时候每两个区间之间不会相交,之间遍历所有区间然后把区间长度相加即可。原创 2024-07-16 19:54:01 · 391 阅读 · 0 评论 -
离散化学习
当数据范围在10^6以内时,我们通常开一个数组就能直接映射,如:让值为i存到a[i]位置当数据范围很大时,如1~10^9、1~10^18次方,但是数据量很少,如10^5个数,此时我们就不能直接映射。以数据范围10^18,数据量10^5为例。一是内存不够,不可能开一个a[10^18]的数组。二是就算能开,遍历一遍时间复杂度也是10^18。此时我们就需要一个辅助数组,把所有数字紧挨着放到一个数组中,就能压缩到10^5,就能支持后续操作。原创 2024-07-01 11:47:49 · 1019 阅读 · 0 评论 -
双指针算法
给定一个长度为n的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。输入格式:第一行包含整数n。第二行包含n个整数(均在0~100000范围内),表示整数序列。输出格式:共一行,包含一个整数,表示最长的不包含重复的数的连续区间的长度。数据范围:1≤n≤100000输入样例:51 2 2 3 5输出样例:3。原创 2023-09-12 10:35:05 · 47 阅读 · 0 评论 -
前缀和与差分
当我们需要频繁求区间的所有元素和的时候,如果每次都遍历一遍,时间复杂度会非常糟糕但如果我们用一个数组s,记录下从每个位置的前i项和,这时我们就可以用的时间求出的和,即。原创 2023-09-03 17:51:30 · 63 阅读 · 0 评论 -
高精度——加减乘除
高精度加法一般都是由于所需要加的数字位数过大,如1e6位,想要实现,我们需要开数组来存储每一位,然后依次对每一位相加,同时进行进位,具体看代码展示逆序输入是为了方便进位。原创 2023-09-03 16:37:10 · 47 阅读 · 0 评论 -
排序与二分
通过分治法,假设有n个数需要从小到大排序,l,r分别为当前序列的左右边界点,我们每次取中间位置(l+r)/2的值x做为依据,将序列分为2部分,左边的=x,然后分别对左右2个序列进行排序,以次类推,一直递归下去。时间复杂度为O(nlogn),最坏情况为n^2当然,也可以直接使用sort排序。实现过程1、每次确定分界点,q[l],q[r],q[(l+r)/2]原创 2023-09-03 09:20:24 · 83 阅读 · 0 评论