算法
WenDavidOI
这个作者很懒,什么都没留下…
展开
-
后缀树与后缀数组
后缀树和后缀数组是字符串处理的两大神器,几乎可处理掉一切的字符串处理问题,但是在实际中,后缀数组比后缀树更好写、好调,同时时间上也不差(常数很小),所以后缀数组绝对是OI竞赛之必备神器。原创 2016-08-12 11:14:36 · 2057 阅读 · 0 评论 -
网络流的基本性质与算法
我决定继续我的学术+数学风格,这种风格虽然有点难理解,但是定义精确,而且往往能反映出更多的性质,比语言描述往往更为简洁。原创 2016-08-13 07:30:39 · 978 阅读 · 0 评论 -
强连通分量
强连通分量仍然是信息学中的基础内容,在图论中和连通分量一样都是相当重要的东西。而强连通分量类型的题不知为什么出现频率很高,比如缩环什么的,考了好多次……原创 2016-08-13 14:38:50 · 1526 阅读 · 0 评论 -
纪中集训d2 提高A组模拟 T3 JZOJ 5236 利普希茨
题目名称大雾…… 这道题目实际上是道结论题,证法多样,所以专门写篇文章。原创 2017-08-07 16:35:02 · 528 阅读 · 0 评论 -
快速傅里叶变换FFT总结
快速傅里叶变换,在竞赛中离散傅里叶变换DFT及其逆变换IDFT尤为常用,主要用于快速求多项式的乘积。原创 2017-08-08 22:08:51 · 2152 阅读 · 0 评论 -
纪中集训d1 提高A组模拟
【T1】 这题实际上是大水题……但是脑抽忽略了DP的阶段性特征,而且明明已经写好了搜索却没有想到直接改记忆化……讲的是对于[1,n][1,n]的数的所有排列,有mm个限制,即令某个数要在另一个数后面,问如果违反最多kk个限制,存在多少种方案数,这里用搜索的思路先推一个暴力,记下目前选了的点,同时违反了jj个限制,然后一个记忆化令f(i,j)\text f(i,j)中ii为选了哪些点,用二进制数来记原创 2017-08-05 19:37:59 · 523 阅读 · 1 评论 -
纪中集训8/14题目泛做
今天的题目太水了,但是我没有AK 【A T1:亲戚(Relatives)】 本质上是求一种对树的拓扑排序序列方案数问题,形式化地说,就是给出mm个限制pi<pjp_i<p_j(这里pip_i表示ii在序列中的位置),问长度为nn的排列的方案数。 题目中给的是若干森林然后排列,但是我们直接用0来做一个超级根,就变成树上DP的问题了。我们现在考虑对于一个根,该怎么合并他的儿子。 我们先设f(x)原创 2017-08-14 17:15:37 · 431 阅读 · 0 评论 -
2017百度之星Astar资格赛 1001度度熊保护村庄
这道题目并不难,但是真的很难想到~一开始我的思路也是各种乱贪心…… 题目链接:http://bestcoder.hdu.edu.cn/contests/contest_showproblem.php?cid=774&pid=1001原创 2017-08-07 15:17:45 · 863 阅读 · 0 评论 -
生成树计数的MatrixTree定理
在省选级别的题目里面,我们会发现有一类生成树计数的题目。就是给定一个图G={V,E}G=\{V,E\},问这个图生成树有多少棵(节点和边都不同)。 这里我们可以用基尔霍夫矩阵做。我们定义一个图有度数矩阵AA,有邻接矩阵BB,其中AiiA_{ii}表示节点ii的度数,其余为0,Bij=1B_{ij}=1表示有边(i,j),反之为00。那么基尔霍夫矩阵就是C=A−BC=A-B 这里先给出结论,生成树原创 2017-09-23 10:47:49 · 369 阅读 · 0 评论 -
纪中国庆集训 简要题解
QaQ主要是因为题目太难写不动blog一直在调程序……所以只好先口胡一波题解原创 2017-10-07 16:55:19 · 474 阅读 · 0 评论 -
17/10/24题目泛做
17/10/24题目泛做原创 2017-10-24 21:41:03 · 415 阅读 · 0 评论 -
17/10/25题目泛做
发现集训题比模拟题画风正常了许多……终于不那么鬼畜了……今天的题目还是可以切的 orz本校神犇%%%zfr AK辣 另外ubuntu pastebin竟然也被封掉了??那我放不了代码了orz原创 2017-10-25 16:16:53 · 437 阅读 · 0 评论 -
【FAKE-ACM】2017-CCPC-FINAL泛刷总结
感觉这个CCPC-FINAL的题目非常常规啊,感觉不少题目都能很快口胡,作为一个向往WF的OIer,自然要刷刷国内的毒瘤题目来提高下姿势水平辣~ 另外就是我写/看最后几题的时候HDU挂掉了……导致看不了题目原创 2018-01-02 17:23:34 · 2475 阅读 · 3 评论 -
Manacher算法详解
Mancher算法如今已是一个常被涉及的的算法,主要适用于和回文串相关的一些题目,虽然说不常用(对于OI的其他算法而言),但却是一个很重要的算法。原创 2016-08-08 09:45:30 · 1375 阅读 · 4 评论 -
KMP(MP)算法详解
Written with StackEdit. 由于CSDN服务器的维护,我迫不得已地用了和CSDN版本相近的StackEdit.KMP算法,是一种字符串匹配的算法。当然,我们已经学过了一两种字符串匹配算法,先来稍微回顾一下。原创 2016-08-07 18:44:31 · 3354 阅读 · 7 评论 -
对质数的判断
众所周知,判断质数在许多领域都有着应用。而判断质数是一个NP问题,所以这使得RSA足够安全。 但是在许多的题目中我们仍然要用到判断质数。所以编写一个高效的算法就成了问题。【引入 - 基本方法】 判断质数,最简单的方法就是枚举数字的每一个因子。因为我们知道数的每一个因子都小于这个数,所以最简单的方法就是直接判断:bool isPrime(int Number){ for (int i=2;i if原创 2016-02-15 19:36:06 · 736 阅读 · 0 评论 -
SPFA最短路算法解析
SPFA是一个比较高效的算法,虽说在比较大的数据时仍然无法比Dijkestra+Heap快,但是代码却很简单,以我的水平而言,代码要短上一倍以上。SPFA这个算法的实用性比较强,所以在OI中是一个相当不错的算法。 SPFA是Bellman-Ford算法的常数优化,如果再加上LLL优化和SLF优化,就更加强大了。下面,我们来剖析其本质:【SPFA的定义】 SPFA的定义和Bellman-Ford的很原创 2016-02-15 19:36:25 · 569 阅读 · 0 评论 -
FloodFill算法的优化
FLoodFill算法名为“洪水填充算法”,根据在网上所看到的解释,大概也就是找到一个可以访问的点,接着进行DFS或BFS,但是用DFS似乎效率不高,BFS又比较难写,这样还不如直接一遍DFS或BFS呢!于是我就想到了另一种实现的方法,但是因为我也不太清楚FloodFill的具体实现,所以可能这个算法有一点雷同。 这个算法可以不断扩展找多个联通块,但是可能需要用并查集来维护多个联通块,所以可能有点原创 2016-02-15 19:36:32 · 1526 阅读 · 0 评论 -
Dijkestra算法的理解与相应的优化
Dijkestra算法是由一个叫Dijkestra的人发明的最短路径算法,是一种单源多点的最短路径算法,时间复杂度仅为O(n^2),并且非常高效,甚至可以优化成O(nlog2n),并且理解了之后就非常简单易懂。 其实几乎所有的最短路径算法理解了之后都觉得像BFS,而Dijkestra也不例外。这个算法的具体步骤是这样的:1.将所有点到源点的最短距离全部设为INF,即正无穷大,并将源点到自己的距离设原创 2016-02-15 19:36:42 · 1015 阅读 · 0 评论 -
Sparse Table算法 - RMQ问题的简单高效算法
Sparse Table算法是用来解决一类RMQ问题的O(nlog2n)的算法,而且代码非常好写,在本质上是一个动态规划,写起来其实也就是几十行。那么在这里的RMQ问题是什么呢?RMQ问题,中文名应该是范围(区间)最(小)值问题,简单描述一下,就是先给出一个序列,然后不断求若干个区间中的一个最值。比如说最小值,最大值之类。像堆那样的数据结构能解决的问题是整个序列的最值问题,而RMQ问题则是序列一段原创 2016-02-15 19:36:51 · 619 阅读 · 0 评论 -
无向树的直径(最长的两点间最短距离)
无向树的直径,一个看似不起眼的东西,却牵涉到了许多的问题。【定义】 什么是无向树的直径?就是最长的两点间最短距离。也就是说,对于某两个点i和j,它们间的最短距离最大。而这就是无向图的直径。【分析】 一开始我以为是二分,看到“最短距离最大”,我瞬间就想到了“最小值最大”。但是这是错误的思路。【暴力1:BFS O(n^2+n*m)】 首先,一种暴力的思路,以每个点当做其中的一个点i,用BFS来找到另一原创 2016-02-15 19:37:58 · 4221 阅读 · 0 评论 -
高斯消元法
高斯消元法的简介。原创 2016-05-20 13:37:27 · 5937 阅读 · 0 评论 -
位运算除法 - frisbee
#include #include using namespace std;//非递归算法,防止溢出int integer_div_function(unsigned int dividend, unsigned int divisor) { if(dividend return 0; unsigned int k, c, res = 0; while(divid原创 2016-02-15 19:35:12 · 1132 阅读 · 0 评论 -
LCA实现的三种不同的方法
LCA,最近公共祖先,实现有多种不同的方法,在树上的问题中有着广泛的应用,比如说树上的最短路之类。 LCA的实现方法有很多,比如RMQ、树链剖分等。今天来讲其中实现较为简单的三种算法:RMQ+时间戳、树上倍增(类似二分步长)、Tarjan算法(DFS+并查集)。【RMQ+时间戳】 什么是时间戳?时间戳,就是被访问到的一个次序。比如说我们首先对一棵树进行深搜,在深搜中访问的相应次序就被我们称为时间戳原创 2016-02-15 19:37:38 · 11061 阅读 · 3 评论 -
拓扑排序
给定一个有向无环图,问怎样遍历,才能够使得其中所有的有向边e={u->v}(其中这条有向边是指从e到v),满足u在v之前遍历?这就涉及到一个叫做“拓扑排序”的算法。 “拓扑排序”的原理是什么?倘若我们将有向边e={u->v},中间的v称作“被u控制”,那么每一个点必须要在其的控制点之后输出。比如说下面这张有向图: 我们首先就可以选择到A和F,并依次输出。因为没有人控制它们。然后,我们可以选择到B原创 2016-02-15 19:38:03 · 661 阅读 · 0 评论 -
最小生成树
首先给定一个连通图P={V,E},其中V是点集,E是边集。那么,最小生成树就是一个图P'={V,E'},使得P'是联通的,而且:E'上每一条边的边的权值之和最小。也就是说最小。 最小生成树有着很广泛的应用。比如说有若干个点,然后我们需要将这些点用最小的费用连接起来,比如说网线的连接,每一条网线的铺设费用就是相应的边权,那么我们做一个最小生成树就可以选择若干条边,将这个网线的系统连通。 但是,其实原创 2016-02-15 19:38:07 · 1228 阅读 · 0 评论 -
最长升/降/不升/不降子序列:模型、解决及扩展应用
【最长升/降/不升/不降子序列:模型】 简单来说,标题中所说的最长升/降/不升/不降子序列这四种类型,都可以概括成一句话。就是对于这个被选出的子序列中的每一个元素,都大于/小于/不小于/不大于子序列中的前一个元素。如果设原来的序列为A,被选出的子序列为B,并且我们用compare(u,v)来表示子序列中的前后满足关系(即当compare(u,v)为真时,v可以在子序列中在u的后面),那么我们将关系原创 2016-02-15 19:38:36 · 1190 阅读 · 0 评论 -
2016-8-4夏令营入营测试总结
本次的测试从思维和编程角度上来说都是很简单的,然而在时间上却并不简单。虽然说我们现在的水平已经相当不错,但是考的仍然不是很好,估计是久离算法的缘故了。题目的链接是http://pan.baidu.com/s/1hrIQMry。原创 2016-08-05 07:28:17 · 1045 阅读 · 0 评论 -
状态压缩的动态规划
状态压缩的动态规划,简称状压DP,是一种将DP和枚举结合起来的方法,可以说是枚举的一种巧妙的优化。 简单来说,如果我们能够划分状态,但是很难继续细分(或者说是状态中的元素都彼此有关,但没有明显的规律),比如说可以将方阵按行划分,但是每行中的每个元素间都有一定的关系时,就可以枚举每一行的状态,再进行DP。也就是说,将状态的表示也作为DP状态表示的一(或几)维,然后相应的进行转移。这真是一个革命性的想原创 2016-08-05 18:52:43 · 1344 阅读 · 0 评论 -
纪中寒假集训1.18总结
qaq题目好难啊 不过也还是可以水分的今天做的THUWC模拟,简要放个题解:【A:群】题意求对于大小为nn的置换对于“复合”这一运算a∘ba\circ b所构成的阶为kk的群的个数 1≤n≤1051\leq n\leq 10^5,1≤k≤51\leq k\leq 5分析最近怎么总是遇到群论的题目……之前loj上碰到两道,今天又来…… 这里kk很小,所以可以考原创 2018-01-18 22:29:52 · 519 阅读 · 0 评论