
算法基础
Nightmare_ak
蒟蒻的求生之路
展开
-
归并排序
数据结构课链表练手- =功能大致有: 链表正序建立,复杂度:O(n) 链表逆序建立,复杂度:O(n) 链表输出,复杂度:O(n) 判断链表是否升序,复杂度:O(n) 链表插入,复杂度:O(n) 链表反转,复杂度:O(n) 链表归并排序,复杂度:O(nlogn)?代码:#include<iostream>using namespace std;struct Node{ int原创 2017-11-22 10:33:29 · 263 阅读 · 0 评论 -
KMP
参考博客: http://www.61mon.com/index.php/archives/183/ http://blog.youkuaiyun.com/yutianzuijin/article/details/11954939/kmp算法: 通过已匹配成功的串来获得信息,决定子串需要移动的位置,注意这里的移动不是真的移动,而是直接更换下标位置。在上面的例子中可以看到,当在d发生匹配失败时,通过ne原创 2017-08-31 17:27:11 · 265 阅读 · 0 评论 -
最长上升子序列(LIS)
参考博客:http://blog.youkuaiyun.com/shuangde800/article/details/7474903循环从1到n,当添加一个新元素时,为了能得到更长的递增序列len+1,那么必须要保证已知的len的递增序列的尾元素最小,那么新元素才有机会加入构成len+1的序列,这一过程中直接用upper_bound(形成非严格递增)或lower_bound(形成严格递增)维护附模板:#inc原创 2017-09-10 21:51:33 · 235 阅读 · 0 评论 -
拓展KMP
参考博客:http://blog.youkuaiyun.com/dyx404514/article/details/41831947附模板:#include<cstring>#include<cstdio>using namespace std;const int maxn = 100010;int next[maxn], ex[maxn];void GETNEXT(char *str){ in原创 2017-08-31 16:45:55 · 283 阅读 · 0 评论 -
素数筛法
讲解一下break的理由:素数与合数的乘积可以由更小的素数与更大的合数来表示,如i=15,15*3记录之后,对于15*5=3*25,只需要以后当i=25时判断即可,避免重复判断void getPrime(){ for (int i = 2;i < MAXN;++i) { if (!vis[i]) prime[tot++] = i;原创 2017-09-06 15:06:41 · 320 阅读 · 0 评论 -
素数判断
以下方法用于不能直接打表求素数时,用于判断素数的方法,效率依次递增方法一:bool isPrime(int n){ for (int i = 2;i*i <= n;++i) if (n % i == 0) return false; return true;}方法二:bool isPrime(int n){ if (n == 2)原创 2017-09-06 14:30:10 · 316 阅读 · 0 评论 -
Graham扫描法
首先先介绍一下叉乘记P1=(x1,y1,z1),P2=(x2,y2,z2) 接下来进行Graham时,z1=z2=0,所以只剩下(x1*y2-x2*y1)k,当x1*y2-x2*y1>0时,即结果与k同向,所以P1在P2的右侧,=0为共线,<0为P1在P2左侧。接下来推荐Graham讲解的博客 http://blog.youkuaiyun.com/u012328159/article/details/5原创 2017-08-15 20:56:02 · 1686 阅读 · 0 评论 -
Lca树链剖分法
树链剖分各数组的作用: son[]:最重的儿子节点 bulk[]:所有儿子节点的总和(包括儿子的儿子) dep[]:该节点的深度 ft[]:该节点的父亲 top[]:链的最上方的节点首先Dfs预处理出前面的四个数组。 然后第二个Dfs进行剖分,预处理出最后一个数组。例子: 此时son[1]=3(因为bulk[3]=6>bulk[2]=5),son[3]=10,son[4]=5,以此原创 2017-08-14 17:35:15 · 668 阅读 · 0 评论 -
Rmq
参考博客:http://blog.youkuaiyun.com/bingshangjiguang/article/details/5673692附模板:#include<cstdio>#include<cmath>#include<algorithm>using namespace std;const int Max = 1000 + 5;int gt[Max], n, st[Max][30];void原创 2017-08-14 10:17:07 · 272 阅读 · 0 评论 -
Lca倍增法
参考博客:http://blog.youkuaiyun.com/liangzhaoyang1/article/details/52549822 (神犇已经讲的很清晰了)原创 2017-08-14 09:58:17 · 321 阅读 · 0 评论 -
快速排序
#include<cstdio>#include<algorithm>using namespace std;void quickSort(int begin, int end, int* array){ if (begin + 1 >= end) return; int mid = (begin + end) / 2;//中间点作为枢纽 int key = array[原创 2017-12-29 22:32:20 · 237 阅读 · 0 评论