
算法
Devil Zoey
这个作者很懒,什么都没留下…
展开
-
素数筛
***素数筛***素数筛顾名思义就是从一堆数中筛选素数。首先介绍的是一种比较容易理解但复杂度不是友好的筛素数方法。首先从2开始将他的倍数都筛掉(在这里是素数将isprime[i]值设为1,然后不是素数设为0,另外初始化所有值为1)。// An highlighted blockvar foo = 'bar';#include <cstdio>#include <io...原创 2018-11-20 14:44:22 · 420 阅读 · 0 评论 -
飞行员匹配(二分图最大匹配)
链接在这儿此题为一个二分图最大匹配简单入门题。匈牙利算法又称增广路算法。用于计算二分图最大匹配。匈牙利算法的正确性基于贪心策略:当一个节点变为匹配点后,然后找他的增广路找到之后更换匹配对象,绝对不会变为非匹配点。#include<bits/stdc++.h>using namespace std;const int N=100+10;bool visit[N];int ...原创 2019-01-03 14:25:34 · 452 阅读 · 0 评论 -
克鲁斯克尔算法
Kruskal算法是一种用来查找最小生成树的算法。流程如下:1.首先建图,存边(创建结构体包含出边,入边以及边权.2.然后对边权进行排序(每次从中选取最小边加入到新图中.3.建立并查集,初始化每个点构成一个集合。4.然后对排序好的边权进行扫描,如果俩个点不在同一个集合中,加入到新图中,如果俩个边在同一个集合中,则继续扫描下一个边。如下图所示:#include<bits/std...原创 2019-01-09 11:07:40 · 754 阅读 · 0 评论 -
prim算法
普里姆(prim)算法是一种用来查找最小生成树的算法。流程如下:1.先存图,存边(用邻接矩阵将出入点和边权存起来)。2.然后选定一个起点加入边集(比如从1开始)。3.然后以边集里面的为起点寻找最小的边权,然后将终点加入到边集里。4.重复步骤三,知道找到最小生成树。5.最后将所有边集加起来。如下图所示:#include&lt;bits/stdc++.h&gt;using name...原创 2019-01-09 20:57:02 · 301 阅读 · 0 评论 -
Dijkstra算法
Dijkstra算法是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题。迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止。算法流程:1.初始化vis[1-n]为0和d数组初始化为无穷大,d[1]=0。2.然后从1-n中找出一个未被标记且d[x]最小的节点x,然后标记x为已经标记x,vis[x]=1.3.扫描x的所有出边,然后更新d数组,d[j]=mi...原创 2019-02-03 12:19:05 · 194 阅读 · 0 评论 -
欧拉函数
欧拉函数:对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)。n可以写成若干若n是质数p的k次幂(如(2)式),可以表示如上图所示。欧拉函数是积性函数,即是说若m,n互质,可以写成如下图所示:于是可以根据(3)式写出代码如下:#include&amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;int Phi(int n){ i...原创 2019-01-23 11:23:24 · 373 阅读 · 1 评论 -
快速幂取模,快速乘取模
首先得知道余数有如下性质:(a+b)%m == (a%m+b%m)%ma*b%c=((a%c)*b)%cab%c=(a%c)*b%ca^p=aa…*a=(a%p) *(a%p) * … *(a%p)代码:#include&amp;amp;lt;bits/stdc++.h&amp;amp;gt;using namespace std;#define LL long longLL quickMod(LL a,...原创 2019-01-23 12:01:39 · 302 阅读 · 0 评论 -
数论问题之质数
质数定义若一个正整数无法被1和它自身之外的任何自然数整除,则称该数为质数(素数),否则该数为合数。质数的判定用试除法:bool is_prime(int n){ if(n&lt;2) return false; for(int i=2;i&lt;=sqrt(n);i++){ if(n%i==0) return false; } return true;}质数的筛选方法:...原创 2019-02-10 18:07:53 · 603 阅读 · 0 评论 -
hdu6681(线段树)
hdu6681题意在n*m的平面上有k条射线,问把这个平面切成多少块?思路预处理一下,按x左边排序,type=1表示开始的位置,type=2表示结束的位置,用线段树维护y轴,单点更新,区间查询.代码#include<bits/stdc++.h>using namespace std;const int maxn=1e5+10;int tree[maxn<...原创 2019-09-07 18:19:36 · 215 阅读 · 0 评论 -
矩阵快速幂(求斐波那契数列)
因为Fib(n)至于最近的俩个序列有关(及Fib(n-1)和Fib(n-2)),所以我们保存最近的那俩个就行了。设f(n)表示一个1*2的矩阵,f(n)=[Fib(n),Fib(n+1)],可以看成【a,b】–>【a+b,b】;所以可以变成f(n)=f(n-1)*A; (A表示一个二维矩阵) A[2][2]={{0,1},{1,1}};然后就可以得到最终的表达式 f(n)={0,1}*...原创 2019-01-05 19:09:16 · 4433 阅读 · 0 评论 -
树形dp(poj 2342 Anniversary party)
poj 2342 Anniversary party简单的树形dp入门题解题思路:每个节点都可以当成一个决策,可以来或者不来,这样一来先找树根节点,然后用dfs从根节点从头开始遍历到叶子节点,判断来还是不来,然后回溯到根节点。dp[i][1]表示来,dp[i][0]表示不来;因此有当i的父节点不来时dp[node][0]+=max(dp[i][0],dp[i][1])当i的父节点来时...原创 2019-01-04 10:54:25 · 144 阅读 · 0 评论 -
拓扑排序
***拓扑排序简要简介及代码***在计算机科学领域,有向图的拓扑排序是其顶点的线性排序,使得对于从顶点 u 到顶点 v的每个有向边uv ,u 在排序中都在v之前。 例如,图形的顶点可以表示要执行的任务,并且边可以表示一个任务必须在另一个任务之前执行的约束; 在这个应用中,拓扑排序只是一个有效的任务顺序。 如果且仅当图形没有定向循环,即如果它是有向无环图(DAG),则拓扑排序是可能的。 任何 D...原创 2018-11-22 21:49:09 · 135 阅读 · 0 评论 -
并查集及其启发式合并
并查集 并查集一般用于对动态连通性的判断,主要应用于判断两个元素是否在同一个 集合,两个点是否连通,变量名等同性以及间接好友的判断。同时并查集经常作为 其他模板的一部分实现某些功能。 并查集常用于的题型为判断某两个元素是否属于同一个集合,判断图是否连通 或是否有环,或配合其他算法如最小生成树Kruskal,与DP共同使用等。(摘自大神) 直接看代码注释解释#include &...原创 2018-11-24 14:26:16 · 1471 阅读 · 0 评论 -
字典树
01字典树水题hdu4825一直出bug,QAQ,还是自己太菜了,水题都浪费了这么长时间。首先得注意取值范围和初始化(我一直没初始化一直没过),还得注意从i=31,开始右移(否则的话换成long long)。#include &lt;bits/stdc++.h&gt;using namespace std;typedef long long LL;#define MAXN 1010 ...原创 2018-11-29 10:20:01 · 120 阅读 · 0 评论 -
实用数据结构的使用
UVA11991 一道简单题给出一个包含n个整数数组,你需要回答若干个询问。每次询问俩个整数k和v,输出从左到右第k个v的下标(数组下标从左到右编号为1-n)。#include&amp;amp;lt;cstdio&amp;amp;gt; #include&amp;amp;lt;vector&amp;amp;gt;#include&amp;amp;lt;map&amp;amp;gt;using names原创 2018-11-30 10:58:31 · 240 阅读 · 0 评论 -
KMP模板及例题
KMP算法就是字符串匹配算法,在一个字符串t中查找字符串p的位置。#include<bits/stdc++.h>using namespace std;const int maxn=1e6+10; int f[maxn];char t[maxn],p[maxn];void getfail(){//失配函数,f[i]表示状态i失配时应该转移到的新状态。 int m=strl...原创 2018-11-27 08:06:48 · 235 阅读 · 0 评论 -
最长上升子序列(LIS)
介绍最长上升子序列问题,也就是Longest increasing subsequence,缩写为LIS。是指在一个序列中求长度最长的一个上升子序列的问题,是动态规划中一个相当经典问题。在这里我们可以看到,这个上升实质上就是一个对&amp;amp;lt;进行定义的过程,所以我们求解的其实是一类问题,也就是在给定序列中求解长度最长的符合某一性质的子序列的问题。解法一状态设计:F[i]代表以A[i]结尾的LIS...原创 2018-11-30 19:39:31 · 354 阅读 · 1 评论 -
多边形的面积
计算任意多边形的面积以三角形为例。{S_abc=fabs(S_oab+S_obc+S_oca)/2=fabs((向量OA X 向量OB)+(向量OB X 向量OC)+(向量OC X 向量OA))/2;}我们根据二维向量叉积计算三角形面积。因为叉积为顺时针为负,逆时针为正,所以可扩展到n边形(凸凹变形都可以)。PS:必须输入的坐标以顺时针或者逆时针。#include&lt;bits/...原创 2018-12-01 12:01:47 · 265 阅读 · 0 评论 -
俩圆相交面积
计算俩圆相交面积首先计算俩圆的距离dis,分析俩圆的位置。(将俩圆用c1和c2表示)。相离 :面积为0.相含 :c1包含c2 或者 c2包含c1.相交:用余弦定理(a²=b²+c²-2bc(cosA))计算俩圆心处的夹角,然后计算俩圆的俩个扇形面积,减去三角形面积( 可以用S=1/2SinB*ac 和海伦公式A=sqrt (s(s-a)(s-b)(s-c)),其中 s=(a+b+c...原创 2018-12-01 12:55:24 · 3869 阅读 · 0 评论 -
STL
stack后进先出栈堆栈是一种容器适配器,专门设计用于在LIFO上下文(后进先出)中操作,其中仅从容器的一端插入和提取元素。stack s; 创建stack对象。s.empty() 判断是否为空。s.pop() 在栈的顶部移除元素。s.push(a) 在栈顶添加元素a。s.size() ...原创 2018-12-01 20:48:43 · 155 阅读 · 0 评论 -
2019CCPC秦皇岛题解
HDU6734签到题HDU6740题意a×循环节已经开始出现的部分长度−b×循环节长度a\times循环节已经开始出现的部分长度-b\times循环节长度a×循环节已经开始出现的部分长度−b×循环节长度思路将小数 点后的字符串倒过来求一次next,然后循环节出现的部分长度为i,循环节长度为i-next[i].代码#include<bits/stdc++.h>u...原创 2019-09-29 13:31:39 · 1533 阅读 · 0 评论