
算法&&模板
文章平均质量分 54
misayap
靴薛珂熬鳃,那锅积尽派。
——silimer
展开
-
[luogu]P1090合并排序-堆
这个是堆的作法,速度很快,只有20ms左右,插排的那个要940-960ms题面另一篇里有#include using namespace std;int siz,n,x,hp[10005],sm;int p,q;void pus(int x){ siz++; hp[siz]=x; int now=siz; while(now>1) { if(hp[now]>原创 2017-12-10 16:04:21 · 224 阅读 · 0 评论 -
二叉查找树&&平衡树基础
操作:二叉查找树(插入,查找,删除,dfs序,求最值,第k大/小) //二叉查找树 //特点:每个点左子树上的点都小于该点,右子树上的点都大于该点 //没有取值相同的点 任意点的左右子树均为二叉查找树 //中序遍历严格单调递增 #include<iostream>#include<cstdio>#include<cstring>#include&...原创 2018-02-10 00:45:20 · 320 阅读 · 0 评论 -
线段树
操作(初始化,单个点的修改,区间的修改,区间查询,lazy标记)//线段树 //每个节点代表一段区间 除叶节点外均有左右子节点 //左子节点:[L,(L+R)/2] 右子节点:[(L+R)/2+1,R] 叶节点长度为1 #include<iostream>#include<cstdio>#include<cstring>#include<c...原创 2018-02-10 00:49:08 · 155 阅读 · 0 评论 -
树状数组
1.sum为前缀和下标为x的数2.add操作更新数组,构建初始数组,如eg1,更新前缀和数组,如eg2,更新差分数组3.对于一个数组A[ ],其差分数组D[i]=A[i]-A[i-1] (i>0)且D[0]=A[0]令SumD[i]=D[0]+D[1]+D[2]+…+D[i] (SumD[ ]是差分数组D[ ]的前缀和)则SumD[i]=A[0]+A[1]-A[0]+A[2]-A[1]+A[...原创 2018-02-09 11:33:46 · 166 阅读 · 0 评论 -
链表与邻接表
对于稀疏图来说,M要远远小于N21234564 51 4 94 3 81 2 52 4 61 3 7第一行两个整数n m。n表示顶点个数(顶点编号为1~n),m表示边的条数。接下来m行表示,每行有3个数x y z,表示顶点x到顶点y的边的权值为z。下图就是一种使用链表来实现邻接表的方法。 上面这种实现方法为图中的每一个顶点(左边部分)都建立了一个单链表(右边部分)。这样我们就可以通过遍历每个顶点...原创 2018-02-08 20:25:43 · 1089 阅读 · 1 评论 -
模板-Tarjan算法与图的连通性
有向图算法流程展示从节点1开始DFS,把遍历到的节点加入栈中。搜索到节点u=6时,DFN[6]=LOW[6],找到了一个强连通分量。退栈到u=v为止,{6}为一个强连通分量。返回节点5,发现DFN[5]=LOW[5],退栈后{5}为一个强连通分量。返回节点3,继续搜索到节点4,把4加入堆栈。发现节点4像节点1的后向边,节点1还在栈中,所以LOW[4]原创 2018-01-06 10:08:22 · 177 阅读 · 0 评论 -
模板-最短路//Dilkstra
Dilkstra算法主要用到的是贪心的思想我们假设2是起点,想要走到终点 4,显然我们有两种走法,而且显而易见,走2-> 1-> 4这条路是最短的。我们不希望走2->4这条路。我们通过1这个点,能把从2->4的路径复杂化(多走一步(多转个弯))但是却能够缩短路径耗时的操作,我们理解为松弛操作,我们完成dijkstra的整个算法的过程,无非就是不断的在松弛的过程。我们原创 2017-12-21 00:11:30 · 345 阅读 · 0 评论 -
模板-中国剩余定理
用现在的语言说,中国剩余定理是这样的:x≡a1(mod m1) x≡a2(mod m2) ······ x≡ar(mod mr) 其中m两两互质,此时x一定有解。由于诸mi(1≤i≤r)两两互素,这个方程组作变量替换,令x=(N/mi)*y,方程组等价于解同余方程:(N/mi)y≡1(mod mi),若要得到特解yi,只要令: xi=(N/mi)*yi,则原创 2018-01-05 16:19:01 · 185 阅读 · 0 评论 -
模板-插入排序
插入排序原理:它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序核心:假设第一个元素排好,之后的元素对排好的部分从后向前比较并逐一移动。理解:看代码,相当于每遍历一个,若不符合队列次序,就把他向前面扔,查到合适的数后面#includeusing namespace std;const int maxn=10000原创 2017-12-07 00:07:55 · 270 阅读 · 0 评论 -
小算法-快速幂
和cmath库里的pow函数作用一样,但速度快的多,原理是b可以拆成n个2的幂值,然后把b转化为二进制,判断各位上是否为一,是则累乘,否则a*a上代码#include#includeusing namespace std;int a,b,c;int res;int pw(int x,int y);int main(){ cin>>a>>b; c=pw(a,b); cout原创 2017-11-24 23:22:38 · 261 阅读 · 0 评论 -
模板-最短路//spfa
求单源最短路的SPFA算法的全称是:Shortest Path Faster Algorithm。 SPFA算法是西南交通大学段凡丁于1994年发表的。 从名字我们就可以看出,这种算法在效率上一定有过人之处。 很多时候,给定的图存在负权边,这时类似Dijkstra等算法便没有了用武之地,而Bellman-Ford算法的复杂度又过高,SPFA算法便派上用场了。有人称原创 2017-12-20 22:41:14 · 240 阅读 · 0 评论 -
模板-邻接表
//邻接表struct Edge{ int to,next;//to表示起源点到的点,next表示上一条边用cnt更新 }edge[505];void add_edge(int bg,int ed){ cnt++; edge[cnt].to=ed; edge[cnt].next=head[bg];//表示起源点所连得上一条边 head[bg]=cnt;//记录 ,更新 }//G原创 2017-11-30 18:25:39 · 268 阅读 · 0 评论 -
模板-树的遍历(先序)
#includeusing namespace std;const int maxn=100005;struct Tree{ int fa; int l; int r;}tr[maxn];void dfs(int x);int a,b;int n,m;int EA;int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ cin>原创 2017-12-02 10:17:52 · 251 阅读 · 0 评论 -
模板-堆(根堆相关操作,堆排)
堆排时从小到大是pus_small&del_stob;从大到小是pus_big&del_btospus函数操作基本原理是把当前点与之上的点比对,有不符合规律的交换;del函数操作基本原理是删去堆顶的点,把最后一个节点放到堆顶进行交换比对操作,若把删去的堆顶存下来的话就是排序#includeusing namespace std;const int maxn=100005;原创 2017-12-10 15:54:20 · 260 阅读 · 0 评论 -
模板-并查集(kruskal)
//kruskal算法,并查集 #include<iostream>#include<cstdio>#include<algorithm>const int maxn=300005;using namespace std;int n,m;int tot;int ans;int fa[maxn];struct edge{ int u; i...原创 2017-11-26 21:37:53 · 208 阅读 · 0 评论