![](https://img-blog.csdnimg.cn/20201014180756927.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法
文章平均质量分 84
tanjunming2020
这个作者很懒,什么都没留下…
展开
-
折半搜索(meet in the middle)
# 介绍折半搜索,又称$\text{meet in the middle}$,指将整个搜索过程分为两部分,并对两部分分别进行搜索,最后得到两个答案序列,将这两个答案序列进行合并,即可得到最终的答案。原创 2023-10-29 21:32:47 · 419 阅读 · 0 评论 -
浅谈根号分治
## 根号分治根号分治是一种优美的暴力。顾名思义,根号分治就是对于一个长度为$N$的数列,将查询和修改分为$\leq N$和$>N$的两个部分来处理。将两个部分分别处理并拼在一起,来优化时间复杂度。原创 2023-10-11 22:13:55 · 507 阅读 · 0 评论 -
李超线段树
## 介绍李超线段树,是用来解决平面直角坐标系中直线或线段的集合在某一点$x$处的最大值或最小值问题。在实现李超线段树的时候,打的标记是不用下传的,也就是标记永久化。在查询时,根节点到对应叶节点上的所有节点的贡献都要计算。线段树的区间对应的是平面直角坐标系的$x$轴上的区间,对于每个区间,要维护的是在这个区间上较优的直线或线段。原创 2023-09-19 19:58:48 · 170 阅读 · 0 评论 -
对顶堆小记
### 介绍对顶堆是由一个大根堆和一个小根堆组成的数据结构,可以用来维护动态第$k$大的数,也可以用来维护中位数。原创 2023-07-11 19:42:48 · 146 阅读 · 0 评论 -
任意模数NTT(拆系数FFT)
### 介绍一般的NTT的模数$P$都要满足$P=r\times 2^k+1$。但如果不满足这个条件,那就不能直接用NTT了,需要用到任意模数NTT。下面就来介绍一种任意模数NTT——拆系数FFT。原创 2023-07-10 19:39:24 · 260 阅读 · 1 评论 -
任意模数NTT(三模数NTT)
### 介绍一般的NTT的模数$P$都要满足$P=r\times 2^k+1$。但如果不满足这个条件,那就不能直接用NTT了,需要用到任意模数NTT。下面就来介绍一种任意模数NTT——三模数NTT。原创 2023-07-04 20:41:35 · 564 阅读 · 0 评论 -
多项式乘法逆
### 多项式乘法逆上面这个问题,就是多项式乘法逆。假设多项式$f(x)$只有一项,那么显然$g_0$为$f_0$的逆元。如果$n>1$,则我们考虑递归求解。原创 2023-05-03 19:39:55 · 1434 阅读 · 0 评论 -
分治FFT(NTT)
### 前言分治$FFT$是基于分治的算法,通过每次计算左区间对右区间的贡献,来降低$FFT$的时间复杂度。原创 2023-04-29 15:03:06 · 3345 阅读 · 1 评论 -
NTT学习笔记(快速数论变换)
在$FFT$中,我们选择$n$次单位复根作为$x$的值,因为他们满足消去引理、折半引理、求和引理,所以可以用分治的方法将时间复杂度变为$O(n\log n)$。但因为用了复数,所以在精度上有误差。而在一些题目要求的是带模的多项式乘法,所以$FFT$就用不了了。那么,我们能不能让$x$取整数值,使得这个值也能满足消去引理、折半引理、求和引理呢?原创 2023-04-29 11:43:51 · 3475 阅读 · 0 评论 -
FFT学习笔记(快速傅里叶变换)
**快速傅里叶变换(Fast Fourier Transformation,简称FFT)** 一般用来加速多项式乘法。求两个$n$次多项式相乘,朴素算法需要$O(n^2)$,但FFT只需要$O(n\log n)$就能解决。原创 2022-12-17 15:52:01 · 2274 阅读 · 0 评论 -
FWT学习笔记(快速沃尔什变换)
## 快速沃尔什变换对于求上面这类运算的卷积,我们可以用$FFT$的思路,将两个多项式先正变换,再按位相乘,最后逆变换回来。这就是$FWT$的思路。原创 2023-04-25 19:24:30 · 1901 阅读 · 2 评论 -
虚树学习小记
## 虚树是什么虚树指在原树上选择需要的点和它们的$LCA$组成的一棵树。这样可以使在树DP时顶点数更少,从而减少时间复杂度。一般用于有多组数据且能保证所有数据访问的点的和不超过规定范围。原创 2023-04-04 17:28:37 · 1387 阅读 · 1 评论 -
扩展lucas定理
## 介绍当正整数$n,m$很大,且质数$p$较小的时候,要求$C_n^m$对$p$取模后的值,可以用lucas定理。但如果$p$不是质数,那该怎么办呢?如果$m$较小,则可以用扩展lucas定理。原创 2023-02-24 19:29:46 · 1708 阅读 · 0 评论 -
Splay
## 前言Splay是一种维护平衡二叉树的算法。虽然它常数大,而且比较难打,但Splay十分方便,而且LCT需要用到。原创 2023-02-14 16:41:14 · 1325 阅读 · 0 评论 -
埃氏筛和欧拉筛
### 前言埃氏筛和欧拉筛都是用来求$n$以内的所有质数。通过将所有不是质数的数标记,最后没有被标记的就是质数。原创 2023-01-30 11:17:50 · 1084 阅读 · 0 评论 -
质数的判断
### 朴素算法在学会判断质数之前,我们要先知道质数的定义。质数是只能被1和本身整除的数。也就是说,一个质数除了1和它本身,没有其他因子。原创 2023-01-29 15:45:23 · 1455 阅读 · 0 评论 -
min25筛学习
## 简介min25筛能在在亚线性时间复杂度求出一类积性函数的前缀和,前提是这个积性函数在质数和质数的幂等位置的函数值比较好求。它借助埃氏筛的思想,将原问题转化为在质因子处的相似的子问题,从而得到一个递推式,达到快速求解的目的。原创 2023-01-14 19:58:40 · 1544 阅读 · 0 评论 -
杜教筛学习
### 杜教筛杜教筛是快速求某些积性函数的前缀和的一种方法,时间复杂度一般能达到$O(n^{\frac 23})$。原创 2023-01-12 10:55:29 · 1171 阅读 · 0 评论 -
莫队学习笔记
## 介绍莫队由莫涛发明,是一种处理区间询问的离线算法。原创 2022-12-18 10:25:17 · 1156 阅读 · 0 评论 -
矩阵树定理
## 用途矩阵树一般用于生成树计数的问题,比如求一个无向图中生成树的个数。用矩阵树定理能极大地降低时间复杂度。原创 2022-12-14 17:32:27 · 1479 阅读 · 0 评论 -
树上启发式合并(dsu on tree)
### dsu on tree$\text{dsu}一般指$\text{disjoint set union}$,即并查集。$\text{dsu on tree}$指树上合并与查询操作,但它的实现和普通的并查集并无关联,两者的共同点仅仅在于都能合并集合和查询而已。$\text{dsu on tree}$,可以称为**树上启发式合并**,是一种巧妙的暴力。原创 2022-12-08 16:08:42 · 2386 阅读 · 0 评论 -
线性基学习
### 线性基介绍有一个序列$A$,若存在一个序列$B$,使得对于$A$中任意若干个数的异或和$k$,一定有$B$中的若干个数,使得这些数的异或和为$k$,且$B$是满足以上条件的长度最小的序列,则称$B$为$A$的线性基。线性基可以用来解决一些子集异或和的问题。原创 2022-12-06 19:14:00 · 1199 阅读 · 0 评论 -
二维树状数组
### 二维树状数组简介二维树状数组用于处理二维数组中的查询和修改。和一维树状数组一样,二维树状数组代码短,常数和空间小,时间复杂度小,十分方便好用。原创 2022-11-22 20:14:19 · 1924 阅读 · 0 评论 -
树状数组学习
### 树状数组简介树状数组,用于维护和查询前缀和,与线段树功能类似。树状数组代码短,常数和空间小,时间复杂度小,所以这也是一个十分优秀的算法。原创 2022-11-22 17:52:22 · 1106 阅读 · 0 评论 -
扩展欧几里得算法(exgcd)
$exgcd$一般是用来求解$ax+by=c$这样的方程的。原创 2022-10-14 20:10:42 · 1934 阅读 · 0 评论 -
凸包算法学习
### 向量1. 既有大小,又有方向的量,如速度2. 表示方法:字母上加箭头$\overrightarrow{a}$3. 向量的大小:表示为$|\overrightarrow{ \ a \ }|$或$|\overrightarrow{ \ AB \ }|$原创 2022-10-10 17:28:56 · 1025 阅读 · 0 评论 -
c++乘法逆元
### 逆元是什么我们都知道,在模意义下:$(a+b)\%p=(a\%p+b\%p)\%p$$(a-b)\%p=(a\%p-b\%p)\%p$$(a\times b)\%p=(a\%p\times b\%p)\%p$但是:$(\dfrac{a}{b})\%p\neq (\dfrac{a\%p}{b\%p})\%p$原创 2022-10-06 20:53:11 · 2521 阅读 · 0 评论 -
三维偏序cdq
了解了二维偏序的$cdq$分治,三维偏序其实就是再套一维。在用左区间更新有区间的时候,第一维和第二维都满足左边小于右边,但第三维不好判断。怎么办呢?用数状数组或线段树来维护第三维即可,其实就是二维偏序$cdq$加一点东西。原创 2022-09-28 17:27:09 · 1063 阅读 · 0 评论 -
cdq分治
### 介绍$cdq$分治是一种分治思想的算法,一般用来求二维偏序的问题,可以将$O(n^2)$的时间复杂度优化到$O(nlogn)$$cdq$分治的主要思想就是将要求的一段区间分为两个区间,先处理两个区间内的贡献,再处理两个区间相互的影响。因为左右区间相互独立,左区间在前,右区间在后,所以只有左区间影响右区间。只要在每次处理区间的时候处理左区间对右区间的影响,就能求出最后的答案。原创 2022-09-28 16:38:30 · 1098 阅读 · 0 评论 -
分块算法详解
长为n的数列,操作涉及区间修改和区间查询,应该如何处理?用线段树等许多数据结构都可以做,但是有时用其它数据结构来解决会十分棘手,代码量也会变得很大。这时,我们就需要用到分块了。............原创 2022-08-26 12:13:37 · 1027 阅读 · 0 评论 -
最长上升子序列(LIS)
最长上升子序列(LIS),就是求一个序列的最长子序列,满足子序列中的元素严格单调递增。原创 2022-09-23 16:22:45 · 961 阅读 · 0 评论 -
整体二分详解
整体二分是一种将所有修改和查询放在一起二分的离线算法。通过将所有操作二分,给每个查询查找一个正确的答案。举个例子,求区间第kkk小值。如果没有修改操作,那么用主席树就可以解决问题。但如果有修改操作的话,主席树就要套上一个数状数组,打起来十分麻烦。所以,对于这样的动态区间第kkk小查询,我们就要用到整体二分了。首先,我们将原数组的nnn个值看作nnn次插入操作,将修改操作看作一次删除操作和一次插入操作,那么所有操作都可以转化为插入、删除、查询操作。将这些操作按时间发生顺序放入队列中。原创 2022-09-21 19:54:21 · 2229 阅读 · 1 评论 -
斜率优化DP
形如f(i)=minai∗x(j)+bi∗y(j)的DP方程一般可以使用斜率优化。其中b单调递增,x(j),y(j)都是通过j能在常数时间内确定的值。原创 2022-09-21 17:30:47 · 1010 阅读 · 0 评论 -
可持久化线段树(主席树)
可持久化线段树,又称主席树,是由不同版本的线段树组成的。这种线段树一般是权值线段树基于动态开点来实现的,可以返回到某个历史版本并在此基础上进行操作。可以用来求区间第k小问题。如果想保存不同历史版本的线段树,肯定要对每一次操作都开一个节点。但这样的话,空间明显会爆。我们继续分析,每次操作只会修改一个叶节点,那么有许多节点都是与之前的版本重复的。所以,在公共部分,当前版本的线段树可以共用之前的节点。这样,空间复杂度就降到了O(nlogn)原创 2022-09-20 15:32:30 · 898 阅读 · 0 评论 -
快速乘详解
两个long long 的数相乘,模一个long long的数,怎么处理?直接乘是肯定不行的,于是我们就要用到快速乘。原创 2022-09-17 19:57:15 · 1162 阅读 · 0 评论 -
线段树合并
对于每次合并,我们从根节点往下依次遍历每个位置,如果某个位置两棵树都存在节点,则将一棵树上的信息加到另一棵树上,然后继续处理它们的左儿子和右儿子。因为权值线段树维护的是值域,而值域的范围可能很大,且值域中的许多位置是空的。此时,叶节点的数量就是元素的数量。一般的线段树维护的是区间上的信息,比如区间最大值,最小值,区间和等,维护的区间都对应数组的一段连续的下标。权值线段树是指以值域为区间的线段树,它维护的区间是一段值域,所以称之为权值线段树。线段树合并指将多棵线段树上的信息合并到一棵线段树上。原创 2022-09-16 15:40:44 · 1420 阅读 · 0 评论 -
快速幂详解
给出$a,b$,求$a^b$我们可以采用二分的思想。首先,要求$a^b$,我们可以先求$a^{\lfloor b/2\rfloor}$,设这个值为$p$,则原创 2022-09-15 16:36:58 · 786 阅读 · 0 评论 -
线段树优化DP
在动态规划中,如果决策点是一段或若干段区间的最值,一般可以用线段树来快速求出决策点,将转移的时间复杂度从O(n)优化到O(logn)细节不必多讲,以下是例题,内附代码,以及题目来源的链接。原创 2022-09-06 19:49:05 · 967 阅读 · 0 评论 -
二进制优化背包
有一个背包,体积为m。现在给出n种物品,每种物品体积为ai,价值为bi,个数为ci。求这个背包能装下物品的最大价值为多少。如果把第i种物品拆成ci个物品来用01背包的方法做,则时间复杂度为O(m∑ci),在一些时候会TLE。所以我们需要用到二进制优化。对于题中的ci,我们可以把它分为(2t−1)+(ci−2t+1),其中t是满足ci−2t+1≥0的最大整数。2t−1。原创 2022-09-02 17:09:21 · 927 阅读 · 0 评论 -
1D/1D动态规划
1D/1D1D/1D1D/1D动态规划,就是指状态数为O(n)O(n)O(n),转移为O(n)O(n)O(n)的动态规划方程。一般的情况下求解的时间复杂度为O(n2)O(n^2)O(n2),但是,通过优化可以使时间复杂度降到O(nlogn)O(nlogn)O(nlogn)甚至O(n)O(n)O(n)。下面来讲一讲1D/1D1D/1D1D/1D动态规划中的决策单调性优化。.........原创 2022-08-31 20:24:08 · 1343 阅读 · 0 评论