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 · 151 阅读 · 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 · 140 阅读 · 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 · 81 阅读 · 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 · 92 阅读 · 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 · 107 阅读 · 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 · 105 阅读 · 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 · 126 阅读 · 0 评论 -
02归并排序
归并排序思想递归的将数组一分为二,并分别排序左右两边数组,边界条件为数组长度 <= 1将排好序的左右两边数组按照从左到右分别比较添加至数组中原题链接:归并排序给定你一个长度为 n 的整数数列。请你使用归并排序对这个数列按照从小到大进行排序。并将排好序的数列按顺序输出。#include <iostream>#include <cstdio>#include <algorithm>using namespace std;const原创 2021-05-09 13:02:38 · 211 阅读 · 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 · 226 阅读 · 0 评论