![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 85
你好世界wxx
Just do it!
展开
-
k路归并排序
问题: 给定k个升序的序列,将这些序列升序排列。解法:使用堆排序,首先讲k个序列中第一个元素放到小根堆中,然后每次取出堆顶元素,然后将该元素所在序列的后一个元素放到堆中,直到堆中没有元素位置。输入:第一行一个数表示序列个数k,后面有 2×k2 \times k2×k 行,每两行表示一个序列,第一个行表示这个序列元素个数,第二行是这个序列。如下是一个输入例子:原创 2022-10-26 22:43:53 · 662 阅读 · 0 评论 -
【力扣】字符串编码解码
题目描述:给定一个 非空 字符串,将其编码为具有最短长度的字符串。编码规则是:k[encoded_string],其中在方括号 encoded_string 中的内容重复 k 次。注:(1)k 为正整数且编码后的字符串不能为空或有额外的空格。(2)你可以假定输入的字符串只包含小写的英文字母。字符串长度不超过 160。(3)如果编码的过程不能使字符串缩短,则不要对其进行编码。如果有多种编码方式,返回任意一种即可。分析。注意:2022.10.12秋招华为软开第一题就是这题。分析如下:代码。原创 2022-10-14 16:18:47 · 1466 阅读 · 0 评论 -
程序读取输入数据
【代码】程序读取输入数据。原创 2022-09-16 20:56:30 · 375 阅读 · 0 评论 -
提高结构体排序的速度方式
提高结构体排序的速度方式通过创建一个和结构体数组长度一样的vecotor数组nums,让nums[i]=i,对nums进行排序,传入自定义比较函数,这样可以提高结构体排序的速度。代码如下:#include <iostream>#include <algorithm>using namespace std;struct Rec { int x, y;} r[5];int main() { r[0] = {7, 5};原创 2022-03-03 13:24:27 · 244 阅读 · 0 评论 -
C++未知行数列数读取数据
C++未知行数列数读取数据当不知道给定矩阵的行数和列数时,读取数据可以使用getline和stringstream。如下是一个读取的示例代码:#include <iostream>#include <sstream>using namespace std;const int N = 1010;int n, m;int g[N][N];int main() { string line; while (getline(cin原创 2022-01-07 15:06:04 · 1455 阅读 · 0 评论 -
模拟退火
模拟退火1. 模拟退火原理原理模拟退火:是一种随机算法,用于解决最优化问题。要求求解的问题对应的函数要有连续性。模拟退火算法是模拟物理过程,有如下参数:(1)温度t:即步长。分为初始温度和终止温度,对应代码中就是初始搜索范围和终止搜索的范围。(2)衰减系数:每次搜索范围减小的比例,是(0, 1)中的一个数,可以取0.999,需要手动调节。在每次迭代的过程中,我们在给定步长区间内随机一个新点,令dt = f(新点)-f(当前点),如果求函数极小值的话,分为两种情况:(1)dt<原创 2021-10-17 21:59:18 · 1355 阅读 · 0 评论 -
Splay
Splay1. Splay原理原理Splay是一颗二叉树,期望高度是log(n)的,但是不是完全平衡的。和其他的平衡树一样,也存在基本的左旋和右旋操作,左旋和右旋示意图如下:该函数实现如下:/* 对节点x进行向右旋转操作(//是需要变更的关系) z z / \ // \ (1) y D原创 2021-10-17 21:55:09 · 276 阅读 · 0 评论 -
FFT(快速傅里叶变换)
FFT1. FFT原理原理FFT(Fast Fourier Transformation),中文名快速傅里叶变换,用来加速多项式乘法。朴素高精度乘法时间复杂度是O(n2)O(n ^ 2)O(n2),n是数据位数;但FFT能在O(n×log(n))O(n \times log(n))O(n×log(n))的时间内解决。假设给定一个多项式:A(x)=a0+a1x+a2x2+...an−1xn−1A(x) = a_0 + a_1 x + a_2 x^2 + ... a_{n-1}原创 2021-10-17 21:49:14 · 11987 阅读 · 1 评论 -
马拉车算法
马拉车算法问题:求一个给定字符串的最长回文子串。1. 原理原理manacher算法专门用于解决给定字符串的最长回文子串。首先马拉车算法只能求解长度为奇数的最长回文子串,因此需要将原串变化为新串,变换规则如下:在原串的首尾分别加上$#和#^,然后相邻的两个字母之间加上#,如下图:原串为a,新串为b,可以发现新串所有的回文串都是奇数长度的,假设在新串中以b[i]为中心的最长回文串的长度为len,则在原串中对应的回文串长度为len-1。因此我们只需要求出新串所有回文串的原创 2021-10-08 22:04:56 · 148 阅读 · 0 评论 -
最小表示法
最小表示法1. 最小表示法原理问题:给定一个字符串,我们可以任意旋转该字符串,返回字典序最小的字符串表示。假设给定我们的字符串是s,首先我们将s复制一遍接到s的尾部,假设字符串长度为n,当我们枚举起点start在返回0~n-1时就可以得到所有字符串的表示。初始让i=0, j=1,比较s[i+k]、s[j+k],用k表示相对于i、j的偏移位置,如果相等的话让k++,直到比较到第一个不相等的位置,假设s[i+k]>s[j+k],则说明对于起点在i~i+k的字符串都不是原串的最小表示,可原创 2021-10-02 11:45:13 · 824 阅读 · 0 评论 -
网络流
网络流1. 网络流原理原理1.1 流网络是一个有向图G=(V, E),可以存在环。该有向图中存在一个源点s和一个汇点t。边上的权重被称为容量c。如下图就是一个流网络:1.2 可行流可行流f表示满足一定条件的网络流。需要满足如下两个条件:(1)容量限制:0≤f(u,v)≤c(u,v)0 \le f(u, v) \le c(u, v)0≤f(u,v)≤c(u,v),其中 f(u,v)、c(u,v)f(u, v)、c(u, v)f(u,v)、c(u,v) 分别表示从u到v原创 2021-09-27 14:52:09 · 1238 阅读 · 1 评论 -
RMQ
RMQ1. RMQ原理原理RMQ算法全称为Range Minimum/Maximum Query,即用来解决区间最值问题。这类问题可以使用线段树解决,但是代码比较长。这里演示使用RMQ算法解决,其实就是动态规划。使用f(i, j)表示:从i开始长度为2j2^j2j的区间中的最大值。求解f的递推公式:f(i,j)=max(f(i,j−1),f(i+2j−1,j−1))f(i, j) = max(f(i, j-1), f(i+2^{j-1}, j-1))f(i,j)=max(f(i,j原创 2021-09-26 15:10:55 · 165 阅读 · 0 评论 -
【动态规划】数位统计DP
数位统计DP1. 数位统计DP定义和数字相关,一般让我们求方案数。题目一般的套路:(1)一般会让求解某个区间中满足某种性质的数的个数,可以转化为求[0, t]中满足条件的数的个数,如果求解[x, y]之间满足性质的数的个数,则结果为f(y) - f(x-1),类似于前缀和的思想。(2)将t每一位数据抠出来,然后一位一位数字进行考虑,按照树的结构进行考虑,如下图(图片来源:网址):2. AcWing上的数位统计DP题目AcWing 338. 计数问题问题描述问题链原创 2021-09-06 13:57:42 · 315 阅读 · 0 评论 -
【动态规划】计数类DP
计数类DP1. 计数类DP定义此类问题一般让我们求解方案数。2. AcWing上的计数类DP题目AcWing 900. 整数划分问题描述问题链接:AcWing 900. 整数划分分析本题存在两种解法,这里都讲解一下。背包解法存在n个物品,这n个物品的体积分别是1、2、...、n,给定一个容量为n的背包,其恰好将背包填满的方案数目,类似于完全背包问题。分析如下:类似于完全背包,可以优化成一维,注意第二层循环体积需要从小到大循环。解法2原创 2021-09-06 13:47:35 · 268 阅读 · 0 评论 -
【动态规划】数字三角形模型
数字三角形模型这类题目一般是在一个二维平面上操作1. AcWing上的数字三角形模型题目AcWing 898. 数字三角形问题描述问题链接:AcWing 898. 数字三角形分析为了方便处理,这里从最底层向上递推。分析如下:代码C++#include <iostream>using namespace std;const int N = 510;int n;int f[N][N]; // 最初存储的是三角形中的值原创 2021-09-05 16:59:15 · 136 阅读 · 0 评论 -
【动态规划】背包问题
背包问题1. 背包问题原理原理请参考网址:背包问题(背包九讲)。2. AcWing上的背包题目AcWing 423. 采药问题描述问题链接:AcWing 423. 采药分析可以把时间T看成背包容量,采摘每个草药的时间和价值分别看成物品的体积和价值,就转化成了01背包问题。代码C++#include <iostream>using namespace std;const int N = 1010;int n, m; //原创 2021-09-05 16:55:13 · 159 阅读 · 0 评论 -
二分算法
二分算法1. 二分算法原理原理二分的本质是具有两段性。整数二分整数二分需要考虑很多边界问题,为此,整理如下模板(参考网址)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;原创 2021-07-15 13:56:52 · 769 阅读 · 0 评论 -
前缀和和差分
前缀和和差分1. 前缀和和差分原理原理前缀和和差分都是分为一维和二维。前缀和前缀和数组要求下标从1开始,这样方便计算。一维前缀和S[i] = a[1] + a[2] + ... a[i]a[l] + ... + a[r] = S[r] - S[l - 1]二维前缀和S[i, j] = 第i行j列格子左上部分所有元素的和以(x1, y1)为左上角,(x2, y2)为右下角的子矩阵的和为:S[x2, y2] - S[x1 - 1, y2] - S[x2, y1原创 2021-07-14 22:06:16 · 316 阅读 · 0 评论 -
【动态规划】树形DP
树形DP1. 树形DP定义在树上进行DP操作。2. AcWing上的树形DP题目AcWing 285. 没有上司的舞会问题描述问题链接:AcWing 285. 没有上司的舞会分析本题相当于让我们每条边上最多选一个点,让选出的点的权值最大。属于最大独立集问题。分析如下:代码C++#include <iostream>#include <cstring>using namespace std;const原创 2021-07-08 22:34:47 · 226 阅读 · 1 评论 -
力扣之Trie(字典树、前缀树)系列
力扣之Trie(字典树、前缀树)系列Leetcode 0208 实现Trie(前缀树)题目描述:Leetcode 0208 实现Trie(前缀树)分析本题的考点:trie。trie又被称为前缀树、字典树。关于trie可以参考:网址。代码C++class Trie {public: struct Node { bool is_end; Node *son[26]; Node() {原创 2021-07-08 10:22:02 · 357 阅读 · 0 评论 -
离散化
离散化1. 离散化原理原理一般来说,当数据范围很大,而我们只需要数据的相对顺序时,就可以使用保序离散化。保序离散化:例如给定我们数据-5, 7, 5211314, -1001, -5,我们可以分为如下几步进行离散化:(1)排序,得到:-1001, -5, -5, 7, 5211314;(2)去重,得到:-1001, -5, 7, 5211314;(3)离散化,可以让这四个数据分别映射到0~3或者1~4,这个需要根据题目选择(例如前缀和或者树状数组应该映射到1~4)。另外还有一原创 2021-06-15 17:28:50 · 257 阅读 · 0 评论 -
贪心算法
贪心算法1. 贪心原理原理不同于动态规划,一般来说动态规划每次会有多种决策方式;贪心算法每次贪心的选择一种决策方式,我们要保证这样的贪心做法能得到最优解,这一般是需要我们证明的。这也是贪心最难的地方。2. AcWing上的贪心算法题目AcWing 905. 区间选点问题描述问题链接:AcWing 905. 区间选点分析本题的步骤如下:(1)将每个区间按照右端点从小到大排序;(2)从前向后依次枚举每个区间:如果当前区间已经包含点,直接继续考察下一个点;否则,原创 2021-06-06 20:25:28 · 269 阅读 · 0 评论 -
【动态规划】区间DP
区间DP1. 区间DP定义所谓区间DP是指在定义状态的时候定义了一个区间,我们根据区间长度len由小到大逐步递推。2. AcWing上的区间DP题目AcWing 282. 石子合并问题描述问题链接:AcWing 282. 石子合并分析分析如下(s表示前缀和数组):代码C++#include <iostream>using namespace std;const int N = 310;int n;int s[N];i原创 2021-05-28 20:32:42 · 132 阅读 · 0 评论 -
【动态规划】线性DP
线性DP1. 线性DP定义这里的定义只是一个概述,所谓的线性DP是指我们的递推方程是存在一个线性的递推关系。可以是一维线性的、二维线性的、三维线性的、…最长上升子序列模型属于线性DP。2. AcWing上的线性DP题目AcWing 898. 数字三角形问题描述问题链接:AcWing 898. 数字三角形分析代码C++#include <iostream>using namespace std;const int N =原创 2021-05-27 11:24:07 · 6194 阅读 · 6 评论 -
高精度运算
高精度1. 高精度原理原理利用vector对很大的数据(long long没法存下,一般用string存储)进行计算,可以分为高精度加减乘除,对于给定A、B(位数最多为10610^6106),给定b(b<=1000),求:(1)A+B;(2)A-B;(3)A*b;(4)A/b。具体每个细节可以参考下面的题目。2. AcWing上的高精度题目AcWing 791. 高精度加法问题描述问题链接:AcWing 791. 高精度加法分析首先就要考虑数据原创 2021-05-25 20:15:42 · 520 阅读 · 0 评论 -
Python常用STL及常用库函数
Python常用STL及常用库函数关于python的基础知识可以参考:Python基础/** * List * Queue * stk * Deque 双端队列 * Set * Map * BitSet * Pair * 位运算 * 常用库函数: * 翻转、去重、随机打乱、sort * lower_bound/upper_bound、nth_element */List# list: 属于序列类型def test3(): # list创建原创 2021-05-19 18:33:36 · 2720 阅读 · 0 评论 -
组合计数
组合计数1. 组合计数原理原理组合计数包含很多内容,比如乘法原理,加法原理,组合数,排列数等。组合计数中存在的方法:(1)递推法;对应AcWing 1307. 牡牛和牝牛;(2)隔板法;对应AcWing 1308. 方程的解;(3)加法原理、乘法原理;(4)组合数,排列数;Cab=a!b!×(a−b)!=a×(a−1)×...×(a−b+1)1×2×...×bC_a^b = \frac{a!}{b! \times (a-b)!} = \frac{a \times (a-1)原创 2021-04-20 21:43:07 · 883 阅读 · 0 评论 -
矩阵乘法
矩阵乘法1. 矩阵乘法原理原理矩阵乘法是大学线性代数中的内容,其定义是:Am×p×Bp×n=Cm×nA_{m \times p} \times B_{p \times n} = C _ {m \times n}Am×p×Bp×n=Cm×n其中C中的每一项如下(A的第i行分别和B的第j列相乘后再相加):C[i][j]=∑k=1pA[i][k]×B[k][j]C[i][j] = \sum _ {k = 1} ^ p A[i][k] \times B[k][j]C[i][j]=k原创 2021-04-19 19:38:14 · 2536 阅读 · 0 评论 -
博弈论
博弈论1. 博弈论原理博弈论是一门学科,这里以题目为例讲解一些博弈论的基本使用。涉及到的知识点如下:Nim游戏公平组合游戏ICG有向图游戏Mex运算SG函数先手必胜状态/先手必败状态Nim游戏:给定 nn 堆石子,两位玩家轮流操作,每次操作可以从任意一堆石子中拿走任意数量的石子(可以拿完,但不能不拿),最后无法进行操作的人视为失败。公平组合游戏ICG需要满足三个条件:(1)由两名玩家交替行动;(2)在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;(3)不原创 2021-04-17 21:04:48 · 381 阅读 · 0 评论 -
容斥原理
容斥原理1. 容斥原理原理容斥原理属于集合论的内容。如果使用|S|表示集合S中元素的个数,那么高中我们最常见的是三个集合的情形:给定三个集合 S1、S2、S3S_1、S_2、S_3S1、S2、S3,求这三个集合元素的个数(重复的元素技能计算一次),如下图:∣S1∪S2∪S3∣=∣S1∣+∣S2∣+∣S3∣−∣S1∩S2∣−∣S1∩S3∣−∣S2∩S3∣+∣S1∩S2∩S3∣|S_1 \cup S_2 \cup S_3| = |S_1| + |S_2| + |S_3| - |S_1原创 2021-04-16 16:10:23 · 2618 阅读 · 0 评论 -
组合数
组合数1. 组合数原理组合数这里的组合数指的是排列组合中的组合数。组合中的问题是:给定a个苹果,从中选择出b个苹果,请问有多少种选法?结果就是组合数CabC_a ^ bCab。关于 CabC_a ^ bCab 的求解公式如下:Cab=a!b!×(a−b)!=a×(a−1)×...×(a−b+1)1×2×...×bC_a^b = \frac{a!}{b! \times (a-b)!} = \frac{a \times (a-1) \times ... \times (a-b+1)}{1原创 2021-04-16 11:26:13 · 3480 阅读 · 0 评论 -
高斯消元
高斯消元1. 高斯消元原理原理高斯消元是用于求解线性方程组的方法。给定如下方程组:{a11×x1+a12×x2+......+a1n×xn=b1a21×x1+a22×x2+......+a2n×xn=b2......an1×x1+an2×x2+......+ann×xn=bn\begin{cases}a_{11} \times x_1 + a_{12} \times x_2 + ...... + a_{1n} \times x_n = b_1 \\a_{21} \times x_1原创 2021-04-15 19:37:52 · 1171 阅读 · 0 评论 -
中国剩余定理
中国剩余定理1. 中国剩余定理原理中国剩余定理:给定一组两两互质的数据m1,m2,...,mkm_1, m_2, ...,m_km1,m2,...,mk,求如下方程组的解x的值:{x=a1 (mod m1)x=a2 (mod m2)...x=ak (mod mk)\begin{cases}x = a_1 \ (mod \ m_1) \\x = a_2 \ (mod \ m_2) \\... \\x = a_k \ (mo原创 2021-04-15 15:49:51 · 293 阅读 · 0 评论 -
扩展欧几里得算法
扩展欧几里得算法1. 扩展欧几里得算法原理在讲解扩展欧几里得算法之前,我们需要了解裴蜀定理。裴蜀定理裴蜀定理:对于任意正整数a, b,一定存在非零整数x, y,使得ax + by = (a, b)。((a, b)指a和b的最大公约数)定理的证明分为两个方面:(1)ax + by一定是(a, b)的倍数;(2)ax + by可以取到(a, b)。(1)是显然的,(2)的证明是构造性证明,这个证明就是扩展欧几里得算法。扩展欧几里得算法欧几里得算法:(a, b)=(b,原创 2021-04-15 11:20:34 · 684 阅读 · 0 评论 -
快速幂
快速幂1. 快速幂原理快速幂快速幂需要解决的问题是:对于给定正整数a、b、p(1≤a、b、p≤1091 \le a、b、p \le 10^91≤a、b、p≤109,p是任意正整数,不一定是质数),让我们求解ab mod pa^b \ mod \ pab mod p的值。核心思想是将b看成一个二进制的数。具体求解分为两步:(1)首先我们可以预处理出如下值:a20 mod pa21 mod p...a2⌊log(k)原创 2021-04-15 09:59:35 · 249 阅读 · 0 评论 -
欧拉函数
欧拉函数1. 欧拉函数原理欧拉函数1 ~ N 中与 N 互质的数的个数被称为欧拉函数,记为 ϕ(N)\phi(N)ϕ(N),例如ϕ(6)=2\phi(6)=2ϕ(6)=2,因为1~6中和6互质的有1和5。特殊规定ϕ(1)=1\phi(1)=1ϕ(1)=1。如果一个数N可以质因数分解为 p1α1∗p2α2∗...∗pkαkp_1^{\alpha_1}*p_2^{\alpha_2}*...*p_k^{\alpha_k}p1α1∗p2α2∗...∗pkαk ,则ϕ(N)=N∗p原创 2021-04-14 20:36:47 · 483 阅读 · 0 评论 -
约数
约数1. 约数原理试除法求约数约数也是成对出现的,因此只需要遍历到n\sqrt nn即可。// 时间复杂度:O(sqrt(n))vector<int> get_divisors(int n) { vector<int> res; for (int i = 1; i <= n / i; i++) if (n % i == 0) { res.push_back(i); if (i !=原创 2021-04-14 18:55:49 · 295 阅读 · 0 评论 -
质数
质数质数,又称为素数。是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。1. 质数原理试除法判断质数根据质数的定义,从2到n-1循环一遍,看是否存在数据能整除n即可判断n是否为质数(试除法),伪码描述如下:// 时间复杂度:O(n)bool is_prime(int n) { if (x < 2) return false; for (int i = 2; i < n; i++) if (n % i == 0) retu原创 2021-04-14 16:59:56 · 2007 阅读 · 1 评论 -
AC自动机
AC自动机1. AC自动机原理原理AC自动机:Trie+KMP的组合。KMPAC自动机是在KMP的基础上进行扩展,在KMP中,我们存在模式串p以及被匹配的串s,我们可以通过KMP算法在O(n)O(n)O(n)的时间内判断p是否在s中出现过、出现的位置以及出现的次数。AC自动机实质上是将模式串p换成了trie树,为了理解AC自动机,我们需要深入理解KMP算法,关于KMP的算法原理如下:这里分析一下一下next数组的求解代码// 求next数组, ne[1]=0表示如果p[1]没原创 2021-04-13 22:28:05 · 396 阅读 · 0 评论 -
平衡树---Treap
平衡树—Treap1. Treap原理原理平衡树的种类:AVL、RBTree、Splay、Treap、sbt、…Treap=Tree(BST) + Heap首先来看什么是BST:Binary Search Tree,即二分搜索树。其定义是递归定义,对于每一个点,其权值严格大于其左子树中所有节点的值,严格小于其右子树所有节点的的值。BST有一个很重要的性质:其中序遍历的结果一定是从小到大的序列。BST的本质:动态维护一个有序序列(集合)。这里实现的BST,默认BST中原创 2021-04-13 11:08:31 · 745 阅读 · 0 评论