基础算法
基础算法
墨染&殇泪
这个作者很懒,什么都没留下…
展开
-
acwing算法基础课:高精度除法
高精度乘法模板vector<int> div(vector<int> &A, int b, int &r){ vector<int> C; for(int i = A.size() - 1; i >= 0; i--) { r = r * 10 + A[i]; C.push_back(r / b); r %= b; } reverse(C.begin(), C.end()); while(C.size() >原创 2021-09-01 20:23:29 · 148 阅读 · 0 评论 -
acwing算法基础课:高精度减法
高精度减法模板// C = A - B, 满足A >= B, A >= 0, B >= 0vector<int> sub(vector<int> &A, vector<int> &B){ vector<int> C; for (int i = 0, t = 0; i < A.size(); i ++ ) { t = A[i] - t; if (i < B原创 2021-09-01 17:58:21 · 68 阅读 · 0 评论 -
acwing算法基础课:归并排序
归并排序模板//先分区,在排序void merge_sort(int q[], int l, int r){ if (l >= r) return; int mid = l + r >> 1; merge_sort(q, l, mid); merge_sort(q, mid + 1, r); int k = 0, i = l, j = mid + 1; while (i <= mid && j <= r)原创 2021-08-28 12:45:15 · 103 阅读 · 0 评论 -
acwing算法基础课:高精度乘法
高精度减法模板vector<int> mul(vector<int> &A, int b){ vector<int> C; int t = 0; for(int i = 0; i < A.size(); i++) { t += A[i] * b;; C.push_back(t % 10); t /= 10; } if(t) C.push_back(t); return C;}例题求高精度整数乘以低精度整数#in原创 2021-09-01 19:43:45 · 89 阅读 · 0 评论 -
acwing算法基础课:区间合并
区间合并模板// 将所有存在交集的区间合并void merge(vector<PII> &segs){ vector<PII> res; sort(segs.begin(), segs.end()); int st = -2e9, ed = -2e9; for (auto seg : segs) if (ed < seg.first) { if (st != -2e9) r原创 2021-09-03 18:28:09 · 127 阅读 · 0 评论 -
acwing算法基础课:前缀和与差分
一维前缀和模板S[i] = a[1] + a[2] + ... a[i]a[l] + ... + a[r] = S[r] - S[l - 1]例题输入一个长度为n的整数序列。接下来再输入m个询问,每个询问输入一对l, r。对于每个询问,输出原序列中从第l个数到第r个数的和。#include <iostream>using namespace std;const int N = 100010;int arr[N], l, r, m, n;int main(){原创 2021-09-02 09:03:58 · 118 阅读 · 0 评论 -
acwing算法基础课:位运算
位运算模板1、求n的第k位数字: n >> k & 12、返回n的最后一位1:lowbit(n) = n & -n例题1分别求出数字n的个二进制位数#include <iostream>using namespace std;int main(){ int n = 10; for(int k = 3; k >= 0; k--) cout << (n >> k & 1); return 0;原创 2021-09-03 10:38:13 · 116 阅读 · 0 评论 -
acwing算法基础课:高精度加法
高精度加法模板vector<int> add(vector<int> &A, vector<int> &B){ vector<int> C; int t = 0; for(int i = 0; i < A.size() || i < B.size(); i++) { if(i < A.size()) t += A[i]; if(i < B.si原创 2021-08-31 23:34:19 · 121 阅读 · 0 评论 -
acwing算法基础课:离散化
离散化模板vector<int> alls; // 存储所有待离散化的值sort(alls.begin(), alls.end()); // 将所有值排序alls.erase(unique(alls.begin(), alls.end()), alls.end()); // 去掉重复元素// 二分求出x对应的离散化的值int find(int x) // 找到第一个大于等于x的位置{ int l = 0, r = alls.size() - 1; while (原创 2021-09-03 12:39:19 · 210 阅读 · 0 评论 -
acwing算法基础课:整数二分算法
整数二分算法模板bool check(int x) {/* ... */} // 检查x是否满足某种性质// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:int bsearch_1(int l, int r){ while (l < r) { int mid = l + r >> 1; if (check(mid)) r = mid; // check()判断mid是否满足性质 e原创 2021-08-30 17:12:19 · 122 阅读 · 0 评论 -
acwing算法基础课:浮点数二分算法
浮点数二分算法模板bool check(double x) {/* ... */} // 检查x是否满足某种性质double bsearch_3(double l, double r){ const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求 while (r - l > eps) { double mid = (l + r) / 2; if (check(mid)) r = mid;原创 2021-08-30 17:46:34 · 96 阅读 · 0 评论 -
acwing算法基础课:双指针算法
双指针算法模板for (int i = 0, j = 0; i < n; i ++ ){ while (j < i && check(i, j)) j ++ ; // 具体问题的逻辑}常见问题分类: (1) 对于一个序列,用两个指针维护一段区间 (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作例题给定一个长度为n的整数序列,请找出最长的不包含重复数字的连续子序列,输出它的长度。#include <io原创 2021-09-02 23:24:11 · 140 阅读 · 0 评论 -
acwing算法基础课:快排
快排模板快排模板如下:void quick_sort(int q[],int l,int r){ if(l >= r) return; int x = q[l + r >> 1],i = l - 1,j = r + 1; while(i < j) { do i++; while(q[i] < x); do j--; while(q[j] > x); if(i <原创 2021-08-27 20:18:26 · 290 阅读 · 0 评论