随笔分类 - 算法简介
摘要:首先我们要明确一个方向,就是 $\text{FFT}$ 的原理是单位根的几个性质:
- 消去原理: $\omega_{tn}^{tk}=\omega_{n}^k$
- 对称原理:$\omega_{n}^{k}=-\omega_n^{k+\frac n 2}$
- $\omega_{n}^k=(\omega_n^1)^k$
- $\omega_n^i\not=\omega_n^j(i\not=j)$
也就是说,只要满足以上条件,也就可以用类似的方法实现。
阅读全文
摘要:种树 在长度为 $n$ 的数列中选择至少 $k$ 个数字,他们都有价值,使得没有相邻的数字被取到,且数字之和最大。 求这个最大的数字之和。 我们考虑一个反悔贪心,首先用一个链表来维护数列,然后,每次贪心的选择最大的数字,并标记左右不可用。 但是这个贪心显然是错的,我们再直接将这三个数字合并为一个,价
阅读全文
摘要:例题一 $$ \sum_{i=1}^n \lfloor\frac n i\rfloor\ $$ 首先很容易想到直接求解,对于较大的数据,$O(n)$做法无法通过。 注意到函数$y=\lfloor\dfrac n x\rfloor$的图像如下: 不难发现,随着 $x$ 增大 ,$y$单调不增,这说明对
阅读全文
摘要:离散傅里叶变换(Discrete Fourier Transform,简称DFT)的思想是利用 $\omega_n^k$将一个多项式转为点值表示法。
对于一个多项式$A(x)=a_0+a_1x+a_2x^2+...+a_{n-1}x^{n-1}$,我们按照前文所云,将所有的 $\omega_n^k$作为 $x$ 代入。
于是我们得到了 $n-1$ 个点,使用复数形式表示,成为一个数组 $(y_0,y_1,y_2,...,y_{n-1})$的。
这被称为 $A(x)$ 的傅里叶变换。
阅读全文
摘要:我们都知道经典的 $O(n \log n)$ 求解 LIS 需要写一个很烦的二分,但是树状数组就不用啦。
观察动态规划转移方程:
$$
f_i=\max_{a_j\leq a_i} f_j +1
$$
注意到这就是一个二维偏序问题,所以树状数组轻松解决,对于我这种数据结构爱好者简直是福音。
阅读全文
摘要:这个算法的用途是,给出 $n$ 个点,第$i$个点为$(x_i,y_i)$,它可以找出一个 $n-1$ 次的多项式$f(x)$,以便求出$x$值为其他情况。
阅读全文
摘要:KMP是一个求解字符串匹配问题的算法。
这个东西的核心是一个$next$数组,$next_i$表示字符串第$0\sim i$项的相同的前缀和后缀的最大长度。
这里的前缀和后缀概念略有不同,
阅读全文
摘要:这是一个有助于分解组合数来求解的定理,适合模数小,数字大的问题。
有质数 $p$,对于$n,m$,如果$n=k_1p+b_1,m=k_2p+b_2$,有
$$
C_n^m\equiv C_{k_1}^{k_2}C_{b_1}^{b_2} \pmod p
$$
阅读全文
摘要:
让深度大的一点不断向上跳,直到两点深度相等
如果两点深度相同但是并不相等,可以两点一起跳
在随机数据下表现优异,因为树会比较平衡,所以近似$O(\log n)$
通常会被卡成单次$O(n)$,其实不难构造,可以构造一个深度大的树(比如链)
阅读全文
让深度大的一点不断向上跳,直到两点深度相等
如果两点深度相同但是并不相等,可以两点一起跳
在随机数据下表现优异,因为树会比较平衡,所以近似$O(\log n)$
通常会被卡成单次$O(n)$,其实不难构造,可以构造一个深度大的树(比如链)
阅读全文
摘要:
我们考虑找到一个 $k$ 和 一个 $r$ 使得上述式子成立,这个并不难
首先枚举 $r$ ,显然有 $r(1\leq r\leq m)$ 注意这里和广大打法不同
因为广大打法是枚举余数,这里枚举的是相反的
然后把右边式子的值哈希存下,枚举左边的 $k(1\leq k \leq m)$
对于左边枚举求出的值看看哈希数组是否存在对应的右边的值,如果有,那么就是一个解
搞出一个最小的解好像也不是很难吧.....
阅读全文
我们考虑找到一个 $k$ 和 一个 $r$ 使得上述式子成立,这个并不难
首先枚举 $r$ ,显然有 $r(1\leq r\leq m)$ 注意这里和广大打法不同
因为广大打法是枚举余数,这里枚举的是相反的
然后把右边式子的值哈希存下,枚举左边的 $k(1\leq k \leq m)$
对于左边枚举求出的值看看哈希数组是否存在对应的右边的值,如果有,那么就是一个解
搞出一个最小的解好像也不是很难吧.....
阅读全文
摘要:
传递闭包其实就是求出 i 可不可以直接或间接到达 j
我们用 邻接矩阵 存储
用 弗洛伊德,如果 i 能到 k,且 k 能 到 j,则 i 可以到 j
求一遍,复杂度O( $n^3$ )
阅读全文
传递闭包其实就是求出 i 可不可以直接或间接到达 j
我们用 邻接矩阵 存储
用 弗洛伊德,如果 i 能到 k,且 k 能 到 j,则 i 可以到 j
求一遍,复杂度O( $n^3$ )
阅读全文
摘要:
首先,什么是STL?
STL,全称 Standard Template Library,也就是标准模板库,
它是在惠普实验室开发出来的,它主要出现到C++中,
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),
然后,STL需要调用一个头文件
阅读全文
首先,什么是STL?
STL,全称 Standard Template Library,也就是标准模板库,
它是在惠普实验室开发出来的,它主要出现到C++中,
STL的代码从广义上讲分为三类:algorithm(算法)、container(容器)和iterator(迭代器),
然后,STL需要调用一个头文件
阅读全文

浙公网安备 33010602011771号