上一页 1 ··· 8 9 10 11 12
摘要: $O(n\ log\ n)$预处理,$O(1)$查询最值 $f[i][j]$表示,从$i$位置开始的$2^j$个数中的最大值,例如$f[i][0]$表示的是$i$位置的值,$f[i][1]$表示的是$i$位置和$i+1$位置中两个数的最大值 $code$: 阅读全文
posted @ 2020-01-22 20:13 lhm_liu 阅读(148) 评论(0) 推荐(0) 编辑
摘要: 二叉查找树,对于任意一个节点,该节点的关键码大于它的左子树中任意节点的关键码,该节点的关键码小于它的右子树中任意节点的关键码,且没有键值相等的点 二叉查找树的中序遍历是一个关键码单调递增的节点序列 数组及变量 $fa[i]:$ 节点$i$的父节点 $son[i][0]:$ 节点$i$的左儿子 $so 阅读全文
posted @ 2020-01-22 20:12 lhm_liu 阅读(264) 评论(0) 推荐(0) 编辑
摘要: 概念: 重儿子:父亲结点的所有儿子中子树结点数目最多($size$最大)的结点 轻儿子:父亲结点中除了重儿子以外的儿子 重边:父亲结点和重儿子连成的边 轻边:父亲结点和轻儿子连成的边 重链:由多条重边连接而成的路径 轻链:由多条轻边连接而成的路径 性质: 在轻边$(u,v)$中,\(size(u)/ 阅读全文
posted @ 2020-01-22 20:11 lhm_liu 阅读(228) 评论(0) 推荐(0) 编辑
摘要: 判负环 跑$SPFA$时,设$sp_cnt[x]$表示从$x$入队次数,若更新时, \(sp\_cnt[y]\gt n\) ,则说明图中有负环,算法正常结束,则图中无负环 bool spfa() { queue<int> q; dis[1]=0; vis[1]=true; q.push(1); wh 阅读全文
posted @ 2020-01-22 20:10 lhm_liu 阅读(237) 评论(0) 推荐(0) 编辑
摘要: 可以通过两次$dfs$或$bfs$求出树的直径,从任意结点出发,搜索得出直径的一个端点,然后从这个端点继续搜索,得出另一个端点,但无法处理负边权 $code$: 也可以用树形$DP$求直径,考虑每个结点$x$,求出经过结点$x$的最长链长度,则树的直径长度就是这些最长链长度的最大值,但无法求出直径的 阅读全文
posted @ 2020-01-22 20:09 lhm_liu 阅读(132) 评论(0) 推荐(0) 编辑
摘要: $LCA$,即最近公共祖先,是指在有根树中,找出某两个结点$u$和$v$最近的公共祖先 倍增法求$LCA$,核心本质是让两个结点每次向上走2的幂次步 先处理出倍增数组$fa$,$fa[i][j]$为从结点$i$向上走$2^{j}$步后能走到的结点 再将两个点移到同一深度 最后开始倍增来跳深度,应用了 阅读全文
posted @ 2020-01-22 20:08 lhm_liu 阅读(160) 评论(0) 推荐(0) 编辑
摘要: 拓扑排序是选择入度为$0$的点来进行$bfs$的一个过程,求出拓扑序列 点之间的关系有并列关系和先后关系,因为并列关系的存在,所以拓扑序列不一定是唯一的 $code$: "车站分级" ,巧妙建图,然后用拓扑的性质得出答案 "菜肴制作" ,建反图跑拓扑 阅读全文
posted @ 2020-01-22 20:07 lhm_liu 阅读(125) 评论(0) 推荐(0) 编辑
摘要: 必须考虑的状态: 决策了前$i$位(该填第$p$位) 已填位保证在区间范围内,比最大值小($bool$变量) 由题意来判定填数的范围(如前一位前两位的数,前一位是否为某数) 阅读全文
posted @ 2020-01-22 20:06 lhm_liu 阅读(149) 评论(0) 推荐(0) 编辑
摘要: 由数据范围得出状态,如 "乌龟棋" 和 "杨老师的照相排列" ,分别为用了某种牌几张和某排站了多少人,乌龟棋用牌的使用情况也反映了当前的位置,其实也是根据题意模拟。 根据题意,设置状态,使设置的状态能够覆盖到所有情况,并可以很好的进行转移,如 "移动服务" ,将员工的位置设为状态,并可以进一步优化, 阅读全文
posted @ 2020-01-22 20:05 lhm_liu 阅读(177) 评论(0) 推荐(0) 编辑
摘要: 有向图 搜索树 对有向图进行 \(dfs\) 时,递归经过的有向边形成的树,被称为搜索树。 树边:边 \((x,y)\) 在搜索树中。 前向边:搜索树中存在一条 \(x\) 到 \(y\) 的路径。 后向边:搜索树中存在一条 \(y\) 到 \(x\) 的路径。 横叉边:搜索树中不存在 \(x\) 阅读全文
posted @ 2020-01-22 20:04 lhm_liu 阅读(592) 评论(0) 推荐(2) 编辑
摘要: 二分图匹配(匈牙利算法) 匈牙利算法就是用增广路求最大匹配问题 可以理解为是左部图被匹配 时间复杂度为$O(nm)$,但事实上,对于绝大部分的二分图,匈牙利算法都跑不够上限 此时$mtc[i]$储存的为右部图$i$所对应左部图的匹配 \(code\): bool dfs(int x) { for(i 阅读全文
posted @ 2020-01-22 20:03 lhm_liu 阅读(271) 评论(0) 推荐(0) 编辑
摘要: $Kruskal$ 先把边按照权值进行排序,用贪心的思想优先选取权值较小的边,并依次连接,若出现环则跳过此边(用并查集来判断是否存在环)继续搜,直到已经使用的边的数量比总点数少一即可。 $code$: 其他 若原图不连通,即建出的是一个森林,要结合题意再进行处理,如 "货车运输" ,跑完最大生成树后 阅读全文
posted @ 2020-01-22 20:02 lhm_liu 阅读(137) 评论(0) 推荐(0) 编辑
摘要: \(Floyd\) 多源最短路算法,用邻接矩阵存储,可以处理负边权,不能处理负环,本质是个$DP$。 需要三层循环,时间复杂度为$O(n^{3})$,在稠密图中有优势。 记得$dis$数组要初始化成正无穷(不相连的点之间),并且自己到自己的距离为$0$,即$dis[i][i]=0$。 \(code\ 阅读全文
posted @ 2020-01-22 20:01 lhm_liu 阅读(238) 评论(0) 推荐(0) 编辑
摘要: 邻接矩阵适合稠密图,空间耗费为$n^{2}$(n为点的个数)。 邻接表适合稀疏图,空间耗费为$m$(m为边的条数)。 通常来讲,在数据范围足够小时,采用邻接矩阵,而数据范围大时采用邻接表。 阅读全文
posted @ 2020-01-22 20:00 lhm_liu 阅读(121) 评论(0) 推荐(0) 编辑
摘要: 给定一个字符串,求它的最长回文子串的长度。 这里要注意,回文串是要分奇回文串和偶回文串。为了避免讨论,我们在字符中间加入特殊字符。如$abaabbc$变为 $a$ $b$ $a$ $a$ $b$ $b$ $c$ 。 时间复杂度为$O(n)$。 $code$: 阅读全文
posted @ 2020-01-22 19:58 lhm_liu 阅读(136) 评论(0) 推荐(0) 编辑
摘要: 给定两个字符串$s1$和$s2$,求$s2$在$s1$中所有的出现位置。 $KMP$有递推的感觉。 在模式串$str2$中,对于每一位$str2(i)$ ,它的$kmp$数组应当是记录一个位置$j$,\(j \leqslant i\),并且满足$str2(i)=str2(j)$,并且在$j!=1$时 阅读全文
posted @ 2020-01-22 19:57 lhm_liu 阅读(130) 评论(0) 推荐(0) 编辑
摘要: 字典树就是把所有单词插入一颗搜索树里。这样可以在线性时间内完成查找和维护信息。 应用有, "于是他错误的点名开始了" 和 "补退选" 。 $code$: 阅读全文
posted @ 2020-01-22 19:56 lhm_liu 阅读(304) 评论(0) 推荐(0) 编辑
摘要: 一般的字符串哈希:我们设置一个进制$x$,把这个串$s$看做一个$x$进制数。 $Num=s1 x^0+s2 x^1+s3 x^2+s4 x^3+…$ 然后对一个比较大的质数取模。 这种$hash$方法在随机情况下冲突的概率比较小,除非对着哈希构造方法卡。 模数一般选用一个较大的质数来减小冲突的概率 阅读全文
posted @ 2020-01-22 19:54 lhm_liu 阅读(141) 评论(0) 推荐(0) 编辑
摘要: $NOIP$阶段只要不涉及区间翻转、区间插入的序列问题都可以用线段树实现。 每一个节点维护一个区间的信息。 线段树有分治的感觉。 线段树可以处理很多符合结合律的操作。 时间复杂度,建树为$O(n)$,区间查询和区间修改为$O(log\ n)$。 空间要开原序列长度的四倍。 查询的话就是序列分割,由于 阅读全文
posted @ 2020-01-22 19:53 lhm_liu 阅读(259) 评论(1) 推荐(0) 编辑
摘要: 树状数组的本质是将前缀进行拆分维护,$i$号节点维护的是原序列上$[i lowbit(i)+1,i]$这段区间的信息。 $lowbit(x)$表示$x$这个数在2进制下从低到高第一个非零位在十进制下的,例如$lowbit(7)=1,lowbit(8)=8$。 根据计算机补码的性质可得$lowbit( 阅读全文
posted @ 2020-01-22 19:52 lhm_liu 阅读(124) 评论(0) 推荐(0) 编辑
摘要: 并查集为森林的结构。有多棵多叉树,每个树的根结点定义为这棵树中元素的代表结点。 用于查询两个点是否在同一集合内,以及合并两个集合。 并查集妙用,如 "白雪皑皑" 和 "求和并替换" 。 带有偏移量的并查集,如 "银河英雄传说" 和 "食物链" 。 $code$: 阅读全文
posted @ 2020-01-22 19:50 lhm_liu 阅读(150) 评论(0) 推荐(0) 编辑
摘要: 因为堆是一棵完全二叉树,所以对于一个节点数为$n$的堆,它的高度不会超过$log$ $n$,所以对于插入,删除操作复杂度为$O(log$ $n)$,查询堆顶操作的复杂度为$O(1)$。 可以用来维护若干贪心题,如 "数据备份" (用堆来实现反悔), "超市" (也是一种反悔)。 用对顶堆(一个大根堆 阅读全文
posted @ 2020-01-22 19:49 lhm_liu 阅读(124) 评论(0) 推荐(0) 编辑
上一页 1 ··· 8 9 10 11 12