
笔记
文章平均质量分 59
Lndulge.
一个蒟蒻 OIer
还在努力中 noip加油!
这个博客用来记录笔记和做的题。。
展开
-
[笔记]:[字符串]trie数的基本构造
Trie 树, 又称字典树,单词查找树。它来源于retrieval(检索)中取中间四个字符构成(读音同try)。用于存储大量的字符串以便支持快速模式匹配。主要应用在信息检索领域。原创 2017-05-12 10:46:12 · 354 阅读 · 0 评论 -
[笔记]: 网络流
详细介绍自行百度下面是两个模板都是poj1273模板题1.E_K 增广路算法//http://poj.org/status#include#include#include#include#include#include#includeusing namespace std;const int N=205;const int inf=1<<29;int n,原创 2017-06-19 16:45:52 · 253 阅读 · 0 评论 -
[笔记]: 树链剖分
树链剖分:对于每个结点 连接子节点多的那个子树的边叫做重边重边连起来成链 叫重链 (不止是只有一条重链) 使用线段树或者其他的数据结构存重链 用此数据结构进行操作 两个dfs操作 : 第一个dfs 求出重链 深度dep数组 父节点fa数组 和每个结点的子结点个数size数组 知道了size才可以求出重链 第二个dfs 连接重链 对于每个重链 重链的标号为第一个结点的编号原创 2017-06-05 16:57:28 · 247 阅读 · 0 评论 -
[笔记]: 差分约束
差分约束系统形如这个样子:X1 - X2 X1 - X5 X2 - X5 X3 - X1 X4 - X1 X4 - X3 X5 - X3 X5 - X4 比如要求满足此条件的 x1x2x3x4x5和的最小值怎么做呢? 此时 把式子传化一下 如 X4-X5>=3 (一定带等于) 再变成 X4>=X5+3如求最小值 就是大于等于 小于反之然原创 2017-06-22 21:00:47 · 265 阅读 · 0 评论 -
[笔记]: 区间dp
区间dp对于给出的区间 l r ,f[l][r]记录其最值那么 f[l][r]=f[l][k]+f[k+1][r]+f[k][k];为左半部分+右半部分+切k这一段所带来的收益例题 codevs1048石子归并//http://codevs.cn/problem/1048/#include#include#include#include#include#incl原创 2017-06-12 08:13:15 · 269 阅读 · 0 评论 -
[笔记]:二分图最大匹配匈牙利算法
二分图最大匹配 km算法模板一个mat数组记录匹配的对象 一个flag数组记录对于当前点是否已经匹配flag数组记得每次清空 至于函数部分有个递归的过程//二分图最大匹配KM算法 /*8 5 51 11 22 12 23 34 34 55 5*/#include#include#include#include#include#include#in原创 2017-06-21 16:37:07 · 469 阅读 · 0 评论 -
[笔记]: dp(动态规划)
一、基本概念动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通过决原创 2017-06-13 08:09:06 · 332 阅读 · 0 评论 -
[笔记]: 背包问题
背包问题 关于讲解详见dd大牛的背包九讲原创 2017-06-13 11:49:25 · 225 阅读 · 0 评论 -
[笔记]:[字符串] kmp算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。原创 2017-05-12 19:46:27 · 371 阅读 · 0 评论 -
[笔记]: 并查集
自己总结一下吧 并查集核心的就两个部分一个是查int findf(int x){ return fa[x]==x?x:fa[x]=findf(fa[x]);}一个是并void merge(int x,int y){ fa[findf(x)]=findf(y);}话说 并查集叫并查集就是 并和查啊所以就是找爸爸 找爸爸 并爸爸然后就没了啊转载 2017-06-05 16:49:29 · 345 阅读 · 0 评论 -
[笔记]: 欧拉函数线性筛法
和质数的线性筛法差不多 多加了几句话用到了几个定理 请自行百度这里求的欧拉函数 是指在数论,对正整数n,欧拉函数是小于n的正整数中与n互质的数的数目(φ(1)=1)1.如果这个数是质数 那么φ(i)=i-12.欧拉函数是积性函数 欧拉函数是积性函数——若m,n互质, 特殊性质:当n为奇数时, , 证明与上述类似。若n为质数则原创 2017-06-27 19:04:43 · 403 阅读 · 0 评论 -
[笔记]: 高斯消元
高斯消元是个求解线性一元多次方程的好办法eg:求逆矩阵具体例子例如,考虑下面的矩阵为了找到这个矩阵的逆矩阵,扩充以下矩阵:通过计算,可以将增广矩阵转换为简化行阶梯形式,即把左边转化为单位矩阵:求得B为A的逆矩阵。像这个样子 把方程列成一个矩阵 矩阵的前n个元素是系数原创 2017-06-29 21:19:04 · 332 阅读 · 0 评论 -
[笔记]: LCA最近公共祖先
LCA(Least Common Ancestor),顾名思义,是指在一棵树中,距离两个点最近的两者的公共节点。也就是说,在两个点通往根的道路上,肯定会有公共的节点,我们就是要求找到公共的节点中,深度尽量深的点。还可以表示成另一种说法,就是如果把树看成是一个图,这找到这两个点中的最短距离。倍增法求LCA(在线做法) 详细见注释/*LCA(Least Common Ancestors)原创 2017-06-01 11:38:50 · 247 阅读 · 0 评论 -
[笔记]: 高精度
总结: 关于高精度的计算 大体是一个套路 模拟小学所学的计算过程(竖式计算) 然后注意:1.进位 2.排除前导零原创 2017-05-22 10:27:16 · 294 阅读 · 0 评论 -
[笔记]: RMQ算法(区间查询)
1. 概述RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j算法。当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍。2.RMQ算法对于该问题,最容易想到的解决方案是遍历,复杂度是O(n)。但当数据量转载 2017-06-01 18:06:33 · 418 阅读 · 0 评论 -
[笔记]:指针 链表 邻接表
1.指针#include<iostream>#include<cstdio>#include<cstring>#include<cstdlib>#include<algorithm>#include<cmath>using namespace std;int main(){ int a; scanf("%d",&a); int *b; *b=a;原创 2017-05-16 15:28:36 · 649 阅读 · 0 评论 -
[笔记]: 前向星
前向星与邻接表都存储图的方式 前向星是一种数据结构,以储存边的方式来存储图。构造方法如下:读入每条边的信息,将边存放在数组中,把数组中的边按照起点顺序排序(可以使用基数排序,如下面例程),前向星就构造完了。通常用在点的数目太多,或两点之间有多条弧的时候。一般在别的数据结构不能使用的时候才考虑用前向星。除了不能直接用起点终点定位以外,前向星几乎是完美的。/*样例:6 8 1 2 1 1 3原创 2017-05-25 09:13:08 · 912 阅读 · 0 评论 -
[笔记]: 树状数组
主要看图 i往上找就是i+=2^k; 往下就是减 k是i的二进制右边0的个数 2^k 直接等于i&(-i); 传送门:写的很好 总结 首先,明白树状数组所白了是按照二分对数组进行分组;维护和查询都是O(lgn)的复杂度,复杂度取决于最坏的情况,也是O(lgn);lowbit这里只是一个技巧,关键在于明白c数组的构成规律;分析的过程二进制一定要深入人心,当作心目中的原创 2017-05-23 15:31:04 · 269 阅读 · 0 评论 -
[笔记]:[栈] 表达式求值
表达式求值 给定一个表达式 例 :1+2*3= 输出: 7原创 2017-05-11 11:55:11 · 606 阅读 · 0 评论 -
[笔记]:归并排序
归并排序(MERGE-SORT)是建立在归并操作上的一种有效的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。 归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第一个有序表中的元素a[i]复制到r[k]中,并原创 2017-05-15 18:52:59 · 233 阅读 · 0 评论 -
[笔记]: 二叉树 遍历转换
遍历命名 根据访问结点操作发生位置命名: ① NLR:前序遍历(Preorder Traversal 亦称(先序遍历)) ——访问根结点的操作发生在遍历其左右子树之前。 (中 左 右) ② LNR:中序遍历(Inorder Traversal) ——访问根结点的操作发生在遍历其左右子树之中(间)。 (左 中 右) ③ LRN:后序遍历(Postorder Traversal)原创 2017-05-16 19:55:20 · 519 阅读 · 0 评论 -
[笔记]: 哈弗曼树(最优二叉树)
给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 哈夫曼树(霍夫曼树)又称为最优树. 1、路径和路径长度 在一棵树中,从一个结点往下可以达到的孩子或孙子结点之间的通路,称为路径。通路中分支的数目称为路径长度。若规定根结点的层数为1,则从根结点到第原创 2017-05-17 16:38:53 · 468 阅读 · 0 评论 -
[笔记]: 二叉排序树
二叉排序树: 二叉树中每个数都有 左结点小于根结点小于右结点 二叉排序树的中序遍历就是结点的data从小到大排序 建树过程: 对于每个结点 从根结点出发 如果大于结点就往右走 小于就往左走 如走到一个结点为空 则将此结点建入树 /* 如输入 31524 树为 3 1原创 2017-05-18 09:34:12 · 407 阅读 · 0 评论 -
[笔记]: 树转二叉树
给出一个多叉树 那么怎么将树转换为一个二叉树呢?/*树-->二叉树 给出一棵树 将此树转化为二叉树采用兄弟表示法 如给出: A B C D E F转化为: A B E C F D转换方法将 树的 最左结点作为二叉树的左节点 从第二个结点开始(左节点的兄弟) 作为二叉数中的右儿子 如例子中的 c是b的兄弟 所原创 2017-05-18 10:22:57 · 326 阅读 · 0 评论 -
[笔记]: 线段树
线段树和树状数组的功能类似 但是比树状数组强大的是线段树可以进行区间的更新操作(不只是单点更新)如把数组1-3加5 或者把数组5-6全部改为4 等等但是线段树的代码量比树状数组要大下面代码/*线段树输入一个数组改变区间l到r 使a数组l到r每个加上d求区间ll到rr的和 样例:101 2 3 4 5 6 7 8 9 105 7 2 1 8 输出42 */#include原创 2017-05-26 11:54:50 · 362 阅读 · 0 评论 -
[笔记]: 记忆化搜索+hash优化&树形dp
1.记忆化搜索记忆化搜索就是搜索过程中记下搜索的值 很简单 没什么好说的下面是一个简单的斐波拉契数列的记忆化搜索代码#include#include#include#include#include#include#define N 100000using namespace std;int f[N];int dfs(int x){ if(f[x]) return f原创 2017-06-07 10:44:55 · 574 阅读 · 0 评论 -
[笔记]: 最小生成树Kruska
转自:http://blog.youkuaiyun.com/lulipeng_cpp/article/details/7800865kruskal算法的精髓在于:每次选取一条边。该边同时满足:1、在当前未选边中权值最小;2、与已选边不构成回路。直到选取n-1条表是算法结束。找到MST活判断不存在MST。 代码设计:1、利用优先级队列将权值小的边放到队列最转载 2017-06-05 16:52:48 · 284 阅读 · 0 评论 -
[笔记]: Tarjan算法求有向图的强连通分量
所谓Tarjan算法建议学习算法竞赛入门经典训练指南中的这一章对此的介绍因为我的解释需要中文十级才看的懂核心就是dfs中记录一个二元组一个叫dfn(就是算法训练入门经典中的pre)还有一个叫lowdfn就是在图中dfs时的时间戳low则是这个点能访问回到的点的dfn的最小值举个例子例如1->45此时的1 4 5 dfn值分别为123 当访问到5的时候lo原创 2017-07-07 21:12:16 · 402 阅读 · 0 评论