ACM--基础算法
文章平均质量分 74
ACM--基础算法
「已注销」
“没有人能把你变好,
时间和经历只是陪衬。
支撑你变得越来越好的,是你坚强的意志、修养、品行,以及不断的反思和修正。”
展开
-
三分法小结
文章目录三分法1.算法分析2.模板2.1 整数三分2.2 浮点数三分3.典型例题三分法1.算法分析如果要求出凸性函数或凹性函数的最值时,我们可以用三分法来求出答案。2.模板2.1 整数三分int l, r;while (r - l > 10) { int midl = l + (r - l) / 3, midr = r - (r - l) / 3; if (check(midl) <= check(midr)) l = midl; // 这里是求凸性函数;如果求凹形原创 2021-07-02 21:31:35 · 356 阅读 · 0 评论 -
区间问题总结
文章目录区间问题1. 算法分析2. 典型例题2.1 选择尽量少的点,使得每个区间内至少包含一个选出的点。2.2 选择若干区间,使得选中的区间之间互不相交(包括端点)。2.3 将区间分成若干组,使得每组内部的区间两两之间没有交集2.4 区间覆盖2.5 合并所有有交集的区间,计算合并完成后的区间个数2.6 计算每个区间与几个区间严格相交区间问题1. 算法分析区间问题很多时候都需要思考是用区间的左端点还是右端点排序,选择合适的排序方法来使用2. 典型例题2.1 选择尽量少的点,使得每个区间内至少包含一个原创 2021-07-02 21:31:09 · 658 阅读 · 0 评论 -
快速输入输出
文章目录快速输入输出1.快读2.快速输出快速输入输出1.快读inline int read() { int s = 0, w = 1; char ch = getchar(); while (ch < '0' || ch > '9') {if (ch == '-') w = -1; ch = getchar();} while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch =原创 2021-07-02 21:30:02 · 70 阅读 · 0 评论 -
根号平衡法
文章目录根号平衡1.算法分析2.典型例题根号平衡1.算法分析有时我们会碰到这样一类问题,长度为nnn的序列,mmm个询问(通常nnn和mmm同阶),可能存在两种比较显然的方法,一种是预O(n)O(n)O(n)处理O(1)O(1)O(1)回答,一种是不预处理回O(n)O(n)O(n)答*mmm*个询问,这两种方法都是O(n2)O(n^2)O(n2)的。考虑是否存在一种策略能“平衡”一下预处理和询问的复杂度。2.典型例题CF1447F2 Frequency Problem (Hard Version)原创 2021-07-02 21:28:20 · 369 阅读 · 0 评论 -
打表法
文章目录打表法1.情景分析2.处理思路2.1 观察法2.1.1 普通性质2.1.2 特殊数列2.2 插值法2.2.1 差分法2.2.2 高斯消元法2.2.3 拉格朗日插值法2.3 暴力线性递推方程打表法1.情景分析当遇到某些问题,已经求得数列的一部分时,要求给定任意项的下标,返回该项的权值。比如现在有一个数列:1,4,9,16,25,…2.处理思路主要有2种题型:一种是要求推导出通项的题目,这类题目需要推导出前几项,然后根据前几项得到通项公式f(x)f(x)f(x),最后根据通式预测f(k)原创 2021-02-16 19:54:20 · 298 阅读 · 0 评论 -
倍增法(ST算法)
文章目录倍增法(ST算法)1.算法描述2.模板2.1 预处理2.2 询问3.典型例题倍增法(ST算法)1.算法描述算法思想st算法,适用于RMQ问题(区间最大值),也就是求出一个序列中,数值最大的一项。朴素做法自然是一遍扫描找最大值,但是当题目询问次数很多的时候,就很有可能超时,因此用倍增算法来进行一个优化。以下是st算法求解RMQ问题的实现:首先,我们用f[i][j]f[i][j]f[i][j]来表示在序列a中,第i位数字以后数2j2^j2j个数之中的最大值,那么就可以得到f[i][0]=a[原创 2021-02-14 01:28:52 · 1526 阅读 · 0 评论 -
双指针
文章目录双指针1. 算法分析2. 模板2.1 维护窗口双指针2.2 区间分割双指针3. 典型例题3.1 维护窗口双指针3.3 区间分割双指针双指针1. 算法分析通过使得两个指针都不断向右移,将O(n2)O(n^2)O(n2)的算法优化到O(n)O(n)O(n)2. 模板2.1 维护窗口双指针for (int i = 0, j = 0; i < n; ++i) { while (j < i && check(i, j)) j++;}2.2 区间分割双指针原创 2021-01-06 02:19:42 · 123 阅读 · 0 评论 -
快速输入输出
文章目录快速输入输出1.快读2.快速输出快速输入输出1.快读inline int read() { int s = 0, w = 1; char ch = getchar(); while (ch < '0' || ch > '9') {if (ch == '-') w = -1; ch = getchar();} while (ch >= '0' && ch <= '9') s = s * 10 + ch - '0', ch =原创 2021-01-06 02:18:10 · 101 阅读 · 0 评论 -
进制转换法
文章目录短除法1.算法分析2.模板短除法1.算法分析短除法是用来将一个数字从n进制转换为m进制的算法。2.模板// 把str从n进制转换为m进制#include <bits/stdc++.h>using namespace std;const int N = 1e3 + 5;typedef long long LL;int n, m;char str1[N], str2[N];int t[N], ans[N];int getnum(char ch) { //字原创 2021-01-06 02:17:27 · 602 阅读 · 0 评论 -
尺取法
文章目录尺取法1. 算法分析2. 板子2.1 一维尺取2.2 二维尺取3. 例题3.1 一维尺取3.2 二维尺取尺取法1. 算法分析尺取法: 尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。尺取法通常可以把一个O(n2)的算法利用特殊性质优化到O(n)的复杂度。之所以能够使用尺取法,是因为元素的前缀和具有单调性,才能使得双指针不会回退。for example:给定一个数列a[n]和一个S, 要求找出连续的一段区间,使得区间和大于等于S,打原创 2021-01-06 02:16:56 · 240 阅读 · 0 评论 -
位运算
文章目录位运算1. 算法分析2. 板子位运算1. 算法分析原码和补码原码: x反码: ~x补码: y = ~x + 1移位左移: x << n 等价于 x * (2 ^ n)例如:x << 2为 1 * (2 ^2)右移: x >> n 等价于 x / (2 ^ n), 如果x为正数,那么在最高位补上0;如果x为负数,那么在最高位补上1使用异或来生成配偶(0, 1), (2,3 ), (4, 5), (6, 7)为配偶对0^1 = 1, 1原创 2020-09-18 01:12:56 · 90 阅读 · 0 评论 -
前缀与差分
文章目录前缀与差分1. 算法分析1.1 前缀和1.2 差分2. 板子2.1 前缀和2.1.1 一维前缀和2.1.2 二维前缀和2.2 差分2.2.1 一维差分2.2.1 二维差分3. 板子3.1 前缀和前缀与差分1. 算法分析1.1 前缀和定义s[n] = ∑i=1na[i]\sum_{i=1}^na[i]∑i=1na[i]递推关系s[i] = a[i] + s[i - 1]区间求和∑i=lra[i]=s[r]−s[l−1]\sum_{i=l}^ra[i] = s[r] - s[l -原创 2020-09-18 01:12:26 · 85 阅读 · 0 评论 -
排序、去重与离散化
文章目录排序、去重与离散化1. 排序1.1 快速排序1.2 归并排序1.3 自定义排序写法2. 去重3. 离散化排序、去重与离散化1. 排序1.1 快速排序1. 快速排序#include <bits/stdc++.h>using namespace std;const int N = 1000010;int q[N];void quick_sort(int q[], int l, int r) { if (l >= r) return; // 使得l恒小原创 2020-09-18 01:11:39 · 344 阅读 · 0 评论 -
高精度与大整数
文章目录高精度与大整数1. 高精度1.1 加法(大数+大数)1.2 减法(大数-大数)1.3 乘法(大数*小数)1.4 除法(大数/小数)2. c++大整数3. java大数高精度与大整数1. 高精度1.1 加法(大数+大数)#include <bits/stdc++.h>using namespace std;// 返回C = A + Bvector<int> add(vector<int> &A, vector<int> &原创 2020-09-18 01:11:23 · 126 阅读 · 0 评论 -
二分
文章目录二分1. 算法分析2. 板子2.1 整数二分2.1.1 找大于某个数的最小值2.1.2 找小于某个数的最大值2.2 浮点数二分3. 例题二分1. 算法分析使用场景使用二分需要满足单调性和连续性。二分法常常用于:题目有找最大/小的答案的字眼,这种情况直接枚举答案计算出复杂度差不多是O(nlogn)时,考虑二分法边界问题l和r的取法:l取可能取到值的左边界,r取可能取到值的有边界判断是否找到答案:判断sum[l]和target的关系,如果相等,找到答案;不相等,找不到答案。如原创 2020-09-18 01:08:19 · 138 阅读 · 0 评论 -
递推与递归
文章目录递推与递归1. 算法分析1.1 递推1.2 递归2. 例题2.1 递推2.1.1 思维递推2.2.4 思维最小步数2.1.2 dp类递推2.2 递归递推与递归1. 算法分析1.1 递推 递推强调当前状态与前一个状态的关系,一种考察类似动态规划的思维处理,另一种考察思维:当前状态确定后,后继的所有状态全部确定。1.2 递归 递归的处理思路就算当前状态取决于子状态的情况,求当前状态需要先计算出子状态后才能决定。2. 例题2.1 递推2.1.1 思维递推acwing95费解原创 2020-09-18 01:08:05 · 128 阅读 · 0 评论 -
暴力算法
暴力算法1. 算法分析 很多时候题目数据量不是很大的时候都可以暴力处理。2. 例题acwing116飞行员兄弟题意: “飞行员兄弟”这个游戏,需要玩家顺利的打开一个拥有16个把手的冰箱。已知每个把手可以处于以下两种状态之一:打开或关闭。只有当所有把手都打开时,冰箱才会打开。把手可以表示为一个4х4的矩阵,您可以改变任何一个位置[i,j]上把手的状态。但是,这也会使得第i行和第j列上的所有把手的状态也随着改变。请你求出打开冰箱所需的切换把手的次数最小值是多少。题解: 由于按键相当于异或,因此原创 2020-09-18 01:06:57 · 3531 阅读 · 0 评论