算法基础
_xuyuanjian_
这个作者很懒,什么都没留下…
展开
-
基础算法7:区间合并
问题:输入N个区间,把所有有交集的区间进行合并,最后输出合并后的区间个数 如 (1,2) (2,4)(5,6)(7,8)(7,9) 得 (1,4) (5,6)(7,9) 1)按区间左端点排序。 2)s原创 2021-03-11 17:34:33 · 176 阅读 · 0 评论 -
基础算法6:离散化
问题引入: a[i]:1 3 100 2000 50000 映射到 0 1 2 3 4 解决问题1:a[]中可能重复元素 解决问题2:如何快速算出x离散化后的值原创 2021-03-11 15:51:07 · 550 阅读 · 1 评论 -
基础算法5:位运算
(一)二进制的第K位 问题:n的二进制表示中第K位是几 公式:(n>>k)&1 (二)lowbit(x): 2.1作用: 返回二进制数,二进数最高位是是x的最后一位1 eg.11000100 返回100 2.2推导: x&-x -x=~x+1 x&(~x+1) 2.3例子: x=1010....1000..0 ~x=0101...0111.....原创 2021-03-10 16:07:26 · 140 阅读 · 0 评论 -
基础算法4:双指针算法
(一)指向一个序列 思路:1)枚举i是所有右端点的区间,左端点j最远在什么位置 2)当i往后移动后,j只能往后走 #include<cstdio> #include<algorithm> #include<iostream> using namespace std; const int N=100010; int a[N]; int S[N]; int n; int main() { cin>>...原创 2021-03-10 15:47:42 · 89 阅读 · 0 评论 -
基础算法2:快速排序与快速选择
1.快速排序 step1:找到分界点x,q[L],q[L+R/2],q[R] step2:左边所有的数都小于等于分界点x,右边的所有数都大于等于x step3:递归排序左边,递归排序右边 模版如下: void quick_sort(int q[], int l, int r) { //注意点1:跳出条件 if (l >= r) return; //注意点2:左右游标选择 int i = l - 1, j = r + 1, x = q[l + r &原创 2021-03-09 15:56:01 · 104 阅读 · 0 评论 -
基础算法1:前缀和与差分
(一)前缀和与差分: 1.一维前缀和 1.1定义: 1.2作用: 能快速求出一段数的和,将 O(n) t降到O(1) 即 2.二维前缀和 2.1定义: 2.2作用:求某个小矩形的面积 2.3初始化: 3.一阶差分 3.1定义:给定a数组,构造b数组,让a数组是b数组的前缀和 3.2作用:在原数组[l,r]所有元素都加上一个常数c : 且 4....原创 2021-03-09 15:10:06 · 193 阅读 · 0 评论