
算法和数据结构模板
学习的算法和数据结构模板
NOI_yzk
我爱oi oi爱我
展开
-
STL数据结构小结
STL数据结构**1.队列 queue –> 优先队列 priority_queue 2.栈 stack 3.向量 vector 4.双向链表 list 5.集合 set –> 可重复集合 multiset 6.映射map**队列先进先出 push(x) 将x加入队列 pop( ) 将第一位移除队列 front( ) 队头元素 back( ) 队尾元素 size(原创 2017-09-16 13:22:48 · 466 阅读 · 0 评论 -
线段树
PART 1 单点更新,区间询问 1443区间和升级版 题目描述 这次的任务是:在伴随着数字改变的情况下,试试统计某段的和。 输入 第一行两个整数n和m,表示有一个长度为n个序列和m个操作 接下来m行,每行的内容属于以下一种: Change x a:把第x个数改成a Query x y:求出[x,y]这段区间的和。 输出 对于每个query,输原创 2017-09-17 08:42:33 · 435 阅读 · 0 评论 -
Trie树
一种用于检索的数据结构 大致就是开一个数组,记录节点 然后记录经过这个节点的字符串个数,以及这个节点表示的字符串个数 分别用pre pass end记录 复杂度大约为len∗mlen*mm为操作数,len为字符串长度 复杂度很小,但内存会比较大 代码实现如下:struct Trie_Tree{ static const int M=3000005; int pre[M][原创 2017-11-28 20:58:25 · 268 阅读 · 0 评论 -
矩阵快速幂
一道模板题 可以发现相乘的三个for可以都for到n 矩阵可以把时间复杂度缩为n3logkn^3logk#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x);i<=(y);i++)#define P 1000000007void Add(int &a,int b){ a+=b;原创 2017-12-13 22:15:31 · 340 阅读 · 0 评论 -
莫队算法
莫队算法较为朴素,适用于大部分的区间查询,主要在于对询问的排序 和区间的滑动 排序参照一下模板struct node{ int l,r,id; bool operator <(const node &_)const{ if(_.l/S!=l/S)return l<_.l; return r<_.r; }}Q[M];然后是L和R的滑动int原创 2017-12-19 21:39:32 · 347 阅读 · 0 评论 -
中国剩余定理
中国剩余定理,是建立在扩展欧几里得上的算法 用来求线性模方程的解 即给出许多模数mi,然后给出余数ai,求原数x 代码如下struct China{ #define N 5 LL A[N],p[N],T[N],m[N],T1[N],M; int n; void exgcd(LL a,LL b,LL &x,LL &y){ if(!b){x=1;y=原创 2017-12-28 22:09:31 · 420 阅读 · 0 评论 -
线性筛
线性筛O(n) 推导一下复杂度: 对于第二重循环 可发现30=2*3*5是由15=3*5推出来的 有一个数的最小质数为x 则可用小于等于这个x的质数推出其他合数 那么每个数只会被推出一次(它只有一个最小质数) 所以总的复杂度为O(n)#includeusing namespace std;#define FOR(i,x,y) for(int i=(x),i##_END=(原创 2018-01-04 21:24:25 · 364 阅读 · 0 评论 -
莫比乌斯系数的筛法
利用线性筛完成的莫比乌斯系数(函数)的推导 注意mu[1]=1;void init(){ mu[1]=1; FOR(i,2,M-1){ if(!mark[i])prime[++cnt]=i,mu[i]=-1; for(int j=1;j<=cnt;j++){ int t=i*prime[j]; i原创 2018-01-06 20:05:32 · 624 阅读 · 0 评论 -
AC自动机
一个自动AC的东西... 套用KMP的fail指针,然后再是利用字典树进行字典与文章的匹配 以下是模板#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x),i##_end_=(y);i<=i##_end_;i++)#define DOR(i,x,y) for(int i=(x),i##_end原创 2017-12-08 18:57:32 · 238 阅读 · 0 评论 -
二分图最大匹配(匈牙利算法)
前言:二分图最大匹配其实就是二分匹配 利用了增广路的思想实现了点对间的一一配对 若想理解匈牙利算法可点击此链接代码实现是比较简单的,匈牙利算法在很多关于匹配的题目中有很灵活的运用(纯属博主瞎逼)代码实现如下:int link[M];bool vis[N];bool Look(int x){ for(int i=0;i<edge[x].size();i++){ int原创 2017-10-17 17:08:07 · 353 阅读 · 0 评论 -
bell-man
虽然现在更新有点迟了,但bellman还是一个值得学习的算法void relax(int u, int v, int weight) { if(dist[v]>dist[u]+weight) dist[v]=dist[u]+weight;}bool Bellman_Ford(){ for(int i=1;i<=n-1;i++) for(int j=原创 2017-10-13 20:54:14 · 745 阅读 · 0 评论 -
迪杰斯特拉
迪杰斯特拉是一个经典的图论算法 利用优先队列优化使复杂度由n*n优化到n*logmstruct SP{ int dis[M]; typedef pair<int,int> P; priority_queue<P,vector<P>,greater<P> >q; void dij(int x){ memset(dis,-1,sizeof(dis));原创 2017-10-03 16:19:11 · 394 阅读 · 0 评论 -
图论——SPFA模板
SPFA是一种求最短路径的算法 SPFA的两种写法,bfs和dfs 判断有无负环: 如果某个点进入队列的次数超过N次则存在负环(SPFA无法处理带负环的图) bfs判别负环不稳定,相当于限深度搜索,但是设置得好的话还是没问题的, dfs的话判断负环很快下面贴出dfs判负环代码(只能判负环,不能求最短路(隔壁机房得出))//flag 是否有负环void DFS_SPFA(int u){原创 2017-09-28 16:08:19 · 395 阅读 · 0 评论 -
最小生成树模板——kruskal
kruskal算法int par[MAX_N];struct edge{int u,v,len;}e[MAX_M]; bool cmp(edge x,edge y){ return x.len<y.len; } int find(int x){return par[x]==x?x:par[x]=find(par[x]);} int Union(int x,int y){ x原创 2017-09-24 20:55:32 · 473 阅读 · 1 评论 -
LCA(最近公共祖先)倍增算法
最近公共祖先有多种算法 如倍增,RMQ,树链剖分等这里先介绍倍增算法 预处理复杂度nlog(n); 询问复杂度log(n);倍增与二进制息息相关 与分块的算法有些相似之处使用倍增算法时开一个fa[n][S]数组 fa[i][j] 表示 i 这个点向上的第1^j个父亲是谁以下是关于如何预处理fa[i][j] 的代码void init() { FOR(j,1,S-1)FOR(i,1,n原创 2017-09-22 15:55:54 · 722 阅读 · 0 评论