
算法笔记
图解算法
ixRic
ixRic
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
杜教筛及其时间复杂度分析
文章目录杜教筛方法举例莫比乌斯函数欧拉函数时间复杂度杜教筛杜教筛用于求一类积性函数的前缀和,时间复杂度可以做到 O(n23)O(n^{\frac{2}{3}})O(n32)。方法设我们要求的是积性函数函数 f(x)f(x)f(x) 的前缀和 S(n)=∑i=1nf(i)S(n) = \sum_{i = 1}^n f(i)S(n)=∑i=1nf(i)。我们取一个积性函数 ggg(ggg 具体是什么由 fff 决定,但这不影响推式子)则 ∑i=1n(f∗g)(i)=∑i=1n∑d∣ig(d)f(i原创 2020-09-07 10:44:15 · 1134 阅读 · 3 评论 -
多项式拉格朗日反演与复合逆
文章目录膜膜膜引入拉格朗日反演扩展拉格朗日反演例题膜膜膜Tiw 永远的神!引入拉格朗日反演及其扩展用于求一类 F(G(x))=H(x)F(G(x)) = H(x)F(G(x))=H(x) 的问题,其中 F(x),H(x)F(x), H(x)F(x),H(x) 为已知多项式函数,G(x)G(x)G(x) 为待求函数。但其只能在 O(nlogn)O(n \log n)O(nlogn) 的时间内求得 G(x)G(x)G(x) 的某一项系数。拉格朗日反演拉格朗日反演用于在 O(nlogn)O(n \原创 2020-07-11 09:46:30 · 1552 阅读 · 0 评论 -
C++ 拉格朗日插值法优化 DP
文章目录拉格朗日插值法简介拉格朗日插值法模板DP 优化思路例题一分析代码例题二分析代码A trick拉格朗日插值法简介众所周知,nnn 个点 (xi,yi)(x_i, y_i)(xi,yi)(任意两个点横坐标不相等)可以确定一个 n−1n - 1n−1 次多项式函数 y=f(x)y = f(x)y=f(x)。拉格朗日插值法可以根据这 nnn 个点求出这个多项式 f(x)f(x)f(x)。当然,实际应用中通常求出横坐标为 kkk 的点在该( nnn 个点确定的)多项式函数上对应的纵坐标的值,代码实现原创 2020-06-11 22:26:22 · 1347 阅读 · 0 评论 -
C++高斯消元详解
文章目录前言直接来代码前言学了才发现这玩意贼简单虽然据说是复习。直接来高斯消元用于解一个线性方程组,就是:{a1,1⋅x1+a1,2⋅x2+⋯+a1,n⋅xn=a1,n+1a2,1⋅x1+a2,2⋅x2+⋯+a2,n⋅xn=a2,n+1⋯an,1⋅x1+an,2⋅x2+⋯+an,n⋅xn=an,n+1\begin{cases}a_{1,1}\cdot x_1+a_{1,2}\cdot ...原创 2019-11-13 08:51:45 · 4784 阅读 · 1 评论 -
Kruskal重构树入门
Kruskal算法众所周知,Kruskal是一种优秀的基于并查集的最小(最大)生成树算法。它的简要流程为:- 将所有边按边权排序;- 依次枚举所有边的两端点u和v,若它们不在一个联通块内,则将该边加入生成树的边集中,且将u、v合并于一个连通块中。Kruskal重构树定义Kruskal重...原创 2019-11-02 11:24:59 · 1344 阅读 · 1 评论 -
FFT(快速傅里叶变换)算法
文章目录功能前置技能多项式的系数表达式多项式的点值表达式复数复数的基本单位复数的运算复平面复根定义几个性质功能O(nlogn)O(n\log n)O(nlogn)的时间求两个多项式的乘积。一个nnn项的整式多项式一定可以表示成:f(x)=∑i=0n−1(aixi)f(x)=\sum\limits_{i=0}^{n-1}(a_ix^i)f(x)=i=0∑n−1(aixi)(有些aia_...原创 2019-02-19 10:56:07 · 4075 阅读 · 0 评论 -
C++马拉车(Manacher)算法
文章目录功能马拉车算法初始化功能马拉车算法(Manacher’s Algorithm):用O(n)O(n)O(n)的时间得到一个字符串中,以每个字符为中心的最长回文的长度。马拉车算法初始化...原创 2018-12-23 13:19:39 · 5328 阅读 · 4 评论 -
C++树的点分治
点分治求树的重心思路模板题模板题大意代码典型例题题目题目大意思路代码点分治树的点分治,是在树中找一个点,把它砍掉后,树就变成了一个森林,然后分别处理这个森林中的每一棵树,统计答案。显然,如果你砍掉叶子结点,这个分治就没有意义了。所以我们要找一个点把树尽可能地平均分,这个点叫树的重心。所谓平均分,就是:这个点的最大子树(包括父亲那边的一堆)的大...原创 2018-07-26 18:04:32 · 640 阅读 · 0 评论 -
C++逆元详解
引入逆元概念求逆元用法例题引入通常情况下,模运算有加法、乘法,减法的分配率,即: (a+b)%m=(a%m+b%m)%m(a+b)%m=(a%m+b%m)%m(a+b)\%m=(a\%m+b\%m)\%m (a−b)%m=(a%m−b%m)%m(a−b)%m=(a%m−b%m)%m(a-b)\%m=(a\%m-b\%m)\%m (a×b)%m=(a%m×b%...原创 2018-07-24 11:34:42 · 5128 阅读 · 1 评论 -
C++二叉搜索树动图详解
二叉搜索树概念实现数据结构初始化构建新结点插入查找删除查找前驱/后继删除完整代码题目代码二叉搜索树二叉搜索树/排序二叉树/二叉查找树都是一样的。概念二叉搜索树满足这样一个性质: 每个结点有一个关键字keykeykey。 对于结点aaa,它左子树里面所有结点的key<a.keykey<a.keykeykey≥a...原创 2018-07-24 11:41:14 · 962 阅读 · 0 评论 -
NOIP2017普及组★总结★题解★规划
题外话吗分析成绩图书管理员棋盘跳房子题外话(吗)本次难度(仅为个人luan gao结果):0%+0%+80%+70%=150% 难度百分比为100%-得分% NOIP2016(近期重做时):0%+0%+0%+60%=60%16年的题提醒了我们要珍惜水资源……可惜当年只有270…… 17年的题提醒了我们不要通过前2题判断这一年的题的难度……分析考的那天发鼻炎,带的2包纸半小时就用完了…原创 2017-11-16 14:08:17 · 1568 阅读 · 4 评论 -
排列问题★DFS
谨以此篇,送给DFS会写炸的我。排列问题暴力排列题目我也不知道要叫它什么,似乎叫“生成N维向量”。我不会告诉你我不懂向量 输入K,N,输出N个有序数列,每个数列中的每个元素可以由1-K组成。 例如当K=3,N=5时,数列为:{1,1,1,1,1},{1,1,1,1,2},……,{3,3,原创 2017-11-23 12:52:31 · 782 阅读 · 0 评论 -
C++求平面最近点对
题目很好理解:给你N个点,求其中距离最近的一对点(之间的距离)。很显然可以枚举,时间复杂度Θ(N^2)如果数据强一点(N=100000什么的),显然枚举直接挂掉,那么要怎么办呢? 这里就要用到分治(当然是二分)了,时间复杂度Θ(Nlog2N)原创 2017-07-15 18:22:02 · 6688 阅读 · 0 评论 -
C++指针详解
众所周知,你在程序中向计算机申请一个变量(如int a),计算机会分配给你的变量一个空间。用int a举例子,计算机就给你了一个名叫a的房子,只能在里面放int类型的值。当然,你可以直接写a=10,这样计算机会帮你找到名叫a的房子,把10放进去。 那么这个房子在哪呢?就有了地址,每个变量都会有一个地址(即它在内存中的位置),指针,便是一根棍子,指着这个位置,指针里存的就是这个地址。怎么用呢原创 2017-05-04 14:11:25 · 21372 阅读 · 10 评论 -
C++树状数组详解
引入如果给你n个数,然后进行q次询问,每次询问一个区间[x,y]的和,你会怎么做? 第一种方法:最简单的方法,用数组存起来,每次枚举x-y,ans加起来就可以,时间复杂度O(qn),十分慢。 第二种方法:或许大多数人会使用前缀和数组:sum[i]=a[1]+a[2]+…+a[i],所以求[x,y]只需要输出sum[y]-sum[x-1]即可,时间复杂度O(n),这是最快的方法之一了。原创 2017-04-28 13:32:53 · 12293 阅读 · 0 评论 -
C++重载运算符详解
结构体基础结构体,是一种可以自己编写数据类型(如int,double等)的一种数据集合,声明关键字struct,框架(声明于main之外):struct 名称{ 集合之中的变量};//分号一定不要忘了例如:struct student{ char name[10]; int grade,num,age;原创 2017-04-25 17:45:59 · 9602 阅读 · 2 评论 -
Splay树
对于被AVL虐得像那啥一样的我们,Splay的到来是无疑是拯(huo)救(shang)人(jiao)民(you)。Splay树,又称伸展树,事实上,它根本就不是平衡树!然而它的平均时间复杂度确是O(log n)。唯一和AVL树一样的是:转转转,转转转……#----------------------------------------------------------原创 2017-03-30 14:00:36 · 1085 阅读 · 0 评论 -
读入优化&输出优化
注意了注意了注意了,重要的事情说3遍,这个东西是骗分神器,骗分神器,骗分神器!!! 众所周知:scanf比cin快得多,printf比cout快得多,如果你不知道就……就现在知道了 那有没有更快的呢?当然。 我懵逼了,至于慢近100ms吗? 好吧,这就是读入优化的效果,在数据很恐怖的情况下能比scanf多过1-5个点……原创 2017-04-08 18:42:22 · 15570 阅读 · 2 评论 -
对拍
【本文毒性较大,建议阅读续文:C++对拍】很多时候,我们或许有一个标程(或者爆搜程序什么的,反正答案是对的),一个自己的程序,然而一组一组的数据经过我们的手动输入后并没有什么问题,可就是有错……咋办,一个一个输数据得到什么时候啊,于是,一个很“高端”的东西诞生了——对拍。 对拍是什么?简单说就是把两个程序对于同一个输入的输出进行比较,没有问题就再来,有问题就停下来,你就可以找到你程...原创 2017-03-03 13:36:04 · 7478 阅读 · 7 评论 -
多叉树(森林)转二叉树
本来不怎么想写这个,但发现网上的都是“残疾”博客,讲得不是很详细,所以我还是要写一下。 多叉转二叉有“左儿子右兄弟”的说法,然而对于什么都不知道的小白,这句话没有任何用……思路大体就两步,很好理解,如图是用来举栗的多叉树: 兄弟连将所有的兄弟间连一条线,如图: 右子断将所有右儿子与父亲的边删掉,如图: 其他事实上这已经是一棵二叉树了,还有一点小细节。调整层次 很容易发现,“兄弟”(即黄色线原创 2017-04-10 14:11:37 · 10865 阅读 · 6 评论 -
【堆】这是要搞事情啊——建立
interesting!堆:简单的说就是一棵完全二叉树的先序,满足任意父结点大于子结点的叫大根堆,反之则是小根堆。建立建立(小根堆)算法(简单粗略加通俗):循环以下步骤把此数(a[i])“塞”到堆尾,然后不停的和它父结点(a[i/2])比较,小就换。给一个硬模拟的代码:void put(int k){ int now,next;//now子结点,next原创 2016-10-03 12:17:11 · 517 阅读 · 0 评论 -
【堆】这是要搞事情啊——取出
堆是什么?请点击取出取出加删除元素(小根堆)算法(简单粗略加通俗):1.取出根结点。2.最后一个节点将根结点覆盖,len--。3.循环:把根结点和它儿子中小的一个交换,直到没有儿子。硬模拟:int get(){ int now,next,res; res=heap[0]; heap[0]=heap[--len]; now=0; while(now*2原创 2016-10-08 13:50:28 · 410 阅读 · 0 评论 -
【图】最短路径——Floyed算法和Dijkstra算法
最短路径问题(floyed.cpp dijkstra.cpp)题目描述平面上有n个点(n输入第1行:1个整数n第2..n+1行:每行2个整数x和y,描述了一个点的坐标第n+2行:1个整数m,表示图中连线的数量接下来有m行,每行2个整数i和j,表示第i个点和第j个点之间有连线最后1行:2个整数s和t,分别表示源点和目标点输出第1行:1个浮点数,表示从s原创 2016-10-18 19:25:20 · 2633 阅读 · 0 评论