01基础算法
基础算法
数学系的学渣
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
09区间合并
区间合并 给定 n 个区间 [li, ri],要求合并所有有交集的区间。 注意如果在端点处相交,也算有交集。 输出合并完成后的区间个数。 例如:[1,3] 和 [2,6] 可以合并为一个区间 [1,6]。 思路 1.先将区间按照左端点升序排序 2.接下来的区间分两种情况: 左端点和上一区间无交点,维护当前区间,区间个数+1 左端点和上一区间有交点,两区间合并,维护的区间为合并后的区间 #include <iostream> #include <algorithm> usi原创 2021-05-09 13:58:11 · 238 阅读 · 0 评论 -
08离散化
离散化 模拟了map的操作 适用:用来处理数据量较少,但数据范围较大的问题。 做法:1. 用hash来映射每一个数 2. 排序去重 3.每次根据数值查找对应key 区间和 假定有一个无限长的数轴,数轴上每个坐标上的数都是 0。 现在,我们首先进行 n 次操作,每次操作将某一位置 x 上的数加 c。 接下来,进行 m 次询问,每个询问包含两个整数 l 和 r,你需要求出在区间 [l, r] 之间的所有数的和。 #include <iostream> #include <vector&原创 2021-05-09 13:50:41 · 188 阅读 · 0 评论 -
07位运算
二进制中1的个数 给定一个长度为 n 的数列,请你求出数列中每个数的二进制表示中 1 的个数。 #include <iostream> using namespace std; const int N = 1e5 + 10; int n; int f(int x) { int res = 0; while (x != 0) { // lowbit(x) 每次找到最低位的1 x -= x & -x; res ++; } return res; } int原创 2021-05-09 13:43:43 · 127 阅读 · 0 评论 -
06双指针算法
最长连续不重复子序列 给定一个长度为 n 的整数序列,请找出最长的不包含重复的数的连续区间,输出它的长度。 #include <iostream> using namespace std; const int N = 1e5; int n; int a[N], nums[N]; int res; int main() { cin >> n; for (int i = 0; i < n; i ++ ) scanf("%d", &a[i]); for (原创 2021-05-09 13:38:43 · 156 阅读 · 0 评论 -
05前缀和与差分
前缀和与差分前缀和子矩阵的和差分差分矩阵 前缀和 原题链接:前缀和 输入一个长度为 n 的整数序列。 接下来再输入 m 个询问,每个询问输入一对 l, r。 对于每个询问,输出原序列中从第 l 个数到第 r 个数的和。 #include <iostream> using namespace std; const int N = 100010; int a[N], s[N]; int n, m; int main() { scanf("%d%d", &n, &m);原创 2021-05-09 13:17:43 · 229 阅读 · 0 评论 -
04高精度
高精度加减乘除高精度加法高精度减法高精度乘法高精度除法 高精度加法 #include <iostream> #include <vector> #include <cstdio> #include <string> using namespace std; void assign(vector<int> &A, string &s) { for (int i = s.size() - 1; i >= 0; i -- ) A原创 2021-05-09 13:09:16 · 224 阅读 · 0 评论 -
03二分
满足区间的左边或右边 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; // 将区间分成两段,分别为true和false,分别找左边最大值或右边最小值 // 检查x是否满足某种性质 bool check(int x) { return true; } // 右边为true,满足右边的最小值 int bsearch_1(int l, int r) {.原创 2021-05-08 08:20:14 · 260 阅读 · 0 评论 -
02归并排序
归并排序 思想 递归的将数组一分为二,并分别排序左右两边数组,边界条件为数组长度 <= 1 将排好序的左右两边数组按照从左到右分别比较添加至数组中 原题链接:归并排序 给定你一个长度为 n 的整数数列。 请你使用归并排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const原创 2021-05-09 13:02:38 · 288 阅读 · 0 评论 -
01快排
快排 Tip:边界情况较多,建议直接把模板背下来 原题链接:快速排序 给定你一个长度为 n 的整数数列。 请你使用快速排序对这个数列按照从小到大进行排序。 并将排好序的数列按顺序输出。 #include <iostream> #include <cstdio> #include <algorithm> using namespace std; const int N = 100010; int n; int a[N]; // 快排模板 void quick_sor原创 2021-05-09 12:47:16 · 328 阅读 · 0 评论
分享