随笔分类 -  经典算法

摘要:快速二进制乘法: 有时我们要求对$a,b$两个数乘积取模,但是两数乘积太大,会爆LL,但是取模结果又不会爆,这时写高精度固然是非常难受的,所以我们可以用二进制乘法来避免它。 原理: 我们将a分解为二进制形式,对于每一个a上的“1”单独相乘,具体方法如下 代码: int qmult(int a,int 阅读全文
posted @ 2016-11-13 10:54 Krew 阅读(463) 评论(0) 推荐(0)
摘要:DFS and Similar [ 1 ] DFS 's Basement 时间戳:记录每个节点入栈和出栈时间 DFS树:遍历整个图后,所有节点加上遍历过的边所构成的树 树边:DFS树中原图的边 反向边:DFS树中将一个节点连接至它祖先节点的祖先的边 [2] Cut Vertex and Bridg 阅读全文
posted @ 2016-11-01 21:53 Krew 阅读(1583) 评论(0) 推荐(1)
摘要:哈希表: 哈希表(hash table)是一种高效的判重算法,一般用于元素范围大但数量不多的情况,还可用于快速查找等部分,而且空间开销也不大。说明白了,就是把定义域内的整数映射到一个我们选定的范围内。 分析: 写一个哈希表,首先你要确定一个映射函数——哈希函数h(x),哈希函数的优劣将直接决定你的哈 阅读全文
posted @ 2016-06-04 23:32 Krew 阅读(160) 评论(0) 推荐(0)
摘要:问题: 竞赛中存在这样一种计数类问题:求在[a,b]区间内满足条件x的数个数(或其他类似目的) 这种问题统称为数位类计数问题,可以用数位DP解决。 解析: 首先这种问题一般满足区间减法,所以我们可以把它转化为 [0,b]的个数 [0,a)的个数。 然后问题变成了:求在[0,b]区间内满足条件x的数个 阅读全文
posted @ 2016-05-16 19:17 Krew 阅读(127) 评论(0) 推荐(0)
摘要:有这样一类LCS问题:它们看上去和传统LCS没有什么不同,但是多了一些奇奇怪怪条件,看上去毫无卵用,但是数据范围却上了一个台阶。 LCS我们除了可以用滚动数组压缩空间外,还有一种转化方法,可以参考这里二楼的回答: "最长公共子序列是否存在低于 O(n^2) 的算法?" 我觉得写得还是不错的。 所以这 阅读全文
posted @ 2016-04-06 22:59 Krew 阅读(538) 评论(0) 推荐(0)
摘要:LIS问题是经典的DP问题,设F[i]为以i结尾的LIS长度,转移方程为: F[i]=max(0,F[j] | i j,A[i] A[j])+1 不难看出这样的复杂度是O(n^2)的,有的时候实在难以承受。 实际上LIS问题存在O(nlogn)的算法 首先我们肯定这样一个事实: 对于F[i]=F[j 阅读全文
posted @ 2016-04-06 22:33 Krew 阅读(217) 评论(0) 推荐(0)
摘要:对于一个有环的链表,我们可以通过把他的各个值打一个hash来判重,但是有的时候,空间上往往不允许我们这样做。 为此我们可以使用FLoyd判圈算法(又称:龟兔赛跑算法),即选定一个起点,然后让两个值分别迭代,一个每次“跑”一次,另一个“跑”两次,只要跑道有环,它们就一定可以相遇。 这样就把空间复杂度压 阅读全文
posted @ 2016-04-01 21:46 Krew 阅读(148) 评论(0) 推荐(0)
摘要:一维前缀和 这个优化主要是用来在O(1)时间内求出一个序列a中,a[i]+a[i+1]+……+a[j]的和。 具体原理十分简单:用sum[i]表示(a[1]+a[2]+……+a[i]),其中sum[0]=0,则(a[i]+a[i+1]+……+a[j])即等于 sum[j] sum[i 1] 。 二维 阅读全文
posted @ 2016-02-11 10:02 Krew 阅读(258) 评论(0) 推荐(0)
摘要:n个城市,两两之间均有道路连接,长度已知。先有一人从某一城市出发,所有城市经过一次且只能经过一次。求最小的总路程。 DP方程:设起点为城市0(最终路径是个环,起点在哪都不影响),设D[i][S]为当前在城市i,将集合S中的城市全部走一遍,再回到城市0的最小总长度。 D[i][S]=min{D[j][ 阅读全文
posted @ 2016-01-24 10:24 Krew 阅读(651) 评论(0) 推荐(0)
摘要:问题: 给出平面上n(n是偶数)个点,两两之间距离为欧几里得距离,求一种两两配对对的方式,使他们连的边总长最小 代码: include include include include include define rep(i,x,y) for (int i=x;i 阅读全文
posted @ 2016-01-24 09:51 Krew 阅读(218) 评论(0) 推荐(0)
摘要:Vector:不定长数组 Vector是C++里的不定长数组,相比传统数组vector主要更灵活,便于节省空间,邻接表的实现等。而且它在STL中时间效率也很高效:几乎与数组不相上下。 实际上vector还有push_front()等操作,但从前端插入会 引起大量元素移动 ,浪费大量时间,不提倡使用。 阅读全文
posted @ 2016-01-21 15:34 Krew 阅读(235) 评论(0) 推荐(0)