算法
Code--Dream
acm
展开
-
树堆(Treap)
平衡树简介:平衡二叉树(Balanced Binary Tree)具有以下性质:它是一 棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等。 最小二叉平衡树的节点的公式如下 F(n)=F(n-1)+F(n-2)+1 这个类似于一个递归的数列,可以参考Fibonacci数列,1是根节点原创 2017-07-17 08:41:25 · 529 阅读 · 0 评论 -
有多少个不同的子串?-- 后缀数组
点击打开题目链接 题目大意: 给你一个字符串问你有多少个不相同的子串?InputT- number of test cases. ToutputFor each test case output one number saying the number of distinct substrings.ExampleInput:2CCCCCAB原创 2016-09-28 14:08:02 · 666 阅读 · 0 评论 -
Vijos P1794 文化之旅
标签: 搜索图结构 最短路 NOIP普及组2012 题目链接 : 点这里 。 这是一道最短路题目,一开始当做暴搜题目来做TLE很多次,想要优化却改成WrongAnswer。原创 2016-07-22 09:48:41 · 1013 阅读 · 1 评论 -
扩展欧几里德算法--学习笔记
扩展欧几里德算法 扩展欧几里德算法是用来在已知a, b求解一组x,y,使它们满足贝祖等式: ax+by = gcd(a, b) =d(解一定存在,根据数论中的相关定理)。扩展欧几里德常用在求解模线性方程及方程组中。 int Exgcd(int a,int b,int &x,int &y){ if (b==0) { x=1,y=0; r转载 2016-07-29 18:32:06 · 389 阅读 · 0 评论 -
最大网络流 EK 算法
网络流是什么类型的问题,看一道题目你就知道了 点击打开链接 。默认具备图论的基本知识,原创 2016-05-27 15:36:01 · 701 阅读 · 0 评论 -
阮一峰 KMP BM算法
存一个链接,讲得好啊!字符串KMP字符串匹配的Boyer-Moore算法转载 2016-04-29 22:10:40 · 1637 阅读 · 0 评论 -
最小生成树 算法
nyoj 38 http://acm.nyist.net/JudgeOnline/problem.php?pid=38prim 克鲁斯卡尔 两个算法首先说说 克鲁斯卡尔算法,按照边的从小到大排序之后,利用并查集的思想,不断并。直到并出n-1条边。 #include#include#include#include#include#include#includ原创 2016-06-18 10:07:00 · 391 阅读 · 0 评论 -
01背包的变形
我弟弟搞OI,问了我一道OI的题目,一看01背包,一做就是一上午。还是对01背包又忘记了。 题目链接:点击打开链接。 01背包,之前博文有代码+讲解,再此就不赘余了。这道题目有主附件关系,但因为附件最多只有2件 ,所以主附件的组合最多4种,分别为 然后进原创 2016-07-13 16:08:56 · 735 阅读 · 0 评论 -
dancing link 精确覆盖 重复覆盖 (DLX)
申明:因为转载的没有给出转载链接,我就把他的链接附上,请尊重原创: http://www.cnblogs.com/-sunshine/p/3358922.html 如果谁知道原创链接 给一下,请尊重原创;问题描述:给定一个n*m的矩阵,有些位置为1,有些位置为0。如果G[i][j]==1则说明i行可以覆盖j列。Problem:1)选定最少的行,使得每列有且仅有一个转载 2016-07-12 17:59:39 · 1004 阅读 · 0 评论 -
最小点覆盖 hdu--1054
点击打开题目链接最小点覆盖=最大二分匹配的 (单向图) ;最小点覆盖=最大二分匹配的一半 (双向图) ;证明 所以我们只需求最大匹配,用 匈牙利算法 求出最大匹配,除以二得到答案 具体算法都已经给出相关链接;下面给出自己AC 代码#include#include#include#include#include#includeusing na原创 2016-07-10 21:38:06 · 415 阅读 · 0 评论 -
线段树-题解
模板原创 2016-11-05 13:51:06 · 407 阅读 · 0 评论 -
树链剖分-入门题目
Query on a tree题目链接: http://vjudge.net/problem/SPOJ-QTREE题目大致意思就是: 给你一棵树,有连个操作: ● 第一个是查询任意两个不同节点上的最短路径上的最大权边! ● 第二个操作修改某一条边的权值;对于一棵树,数的深度如果很大,那么每次查询两个叶子节点,时间复杂度还是很高的。所以我们就把树分成一原创 2016-11-12 16:37:59 · 1332 阅读 · 1 评论 -
线段树-矩形面积求并
题目链接 题目描述: 给定很多个矩形,给定方式是对角线坐标点.求面积的并。大致思路: 扫描线+线段树;#include <stdio.h>#include <iostream>#include <algorithm>#include <string.h>#include <string>#include <stdlib.h>#include <math.h>#inc原创 2017-05-16 18:26:30 · 513 阅读 · 0 评论 -
值域线段树 bzoj 4627
0.0原创 2017-05-16 14:10:55 · 710 阅读 · 0 评论 -
简单数位DP
https://cn.vjudge.net/problem/HDU-4722懒得写看,代码注释吧;主要存板子#include #include #include #include #include #include #include #include #include #include #include #include #include #include原创 2017-03-17 14:48:50 · 571 阅读 · 0 评论 -
主席树学习--入门
本篇文章,讲讲主席树入门,以及区间第K大,或者区间第K小。学习主席树前提是要学习线段树,主席树也就是多棵线段树,每次更新都需要记录之前的线段树,如果每次新建一棵线段树。比较浪费空间时间。因为每次更新一个点只会修改一条树链。其他的树节点信息不改变,所以可以公用一些节点。这就是可持久线段树思想。大致思路我就不再重复了,整理了一些学习资料。算法讲堂-主席树,这个视频是UESTC某位大佬讲解的。很原创 2017-03-15 23:38:34 · 892 阅读 · 0 评论 -
归并排序--小白写的
归并排序 排序算法,最好实现的一种算法之一啊。学习该算法只需要了解递归就好了。首先给出一个问题,给出两个有序的数列,让你把它合成一个有序的数列,那么我们只需要两个同时从前往后看,小的数放到一个临时数组(当然这样是从小到大的排序),这样这个数组里面就是一个有序的了。然后再把这个有序的数组放回原来的位置。所以,会递归,归并排序写起来就很简单了。#include #include #i原创 2017-03-13 16:21:09 · 423 阅读 · 0 评论 -
后缀数组-入门学习
后缀数组论文链接——处理字符串的有力工具_百度文库后缀排序DescriptionTim正在自学《数据结构》,他刚刚学会如何比较两个字符串大小。书上是这么说的(和Pascal语言中的比较规则相同,学习过Pascal语言的同学可以跳过这段): 比较两个不同字符串s1=’p1p2p3…pN’和s2=’q1q2q3…qM’的大小,设N若s1是s2的前缀,则s1qi,且i最小;若pi原创 2016-09-26 19:34:19 · 669 阅读 · 0 评论 -
Manacher 算法
原因:之前会这个算法,过了很久忘了。所以又得重新学习。如果留下自己的笔记,复习起来会很快。所以决定写一写自己的理解。我学习Manacher看的是这一篇博客。首先这个算法是解决最长回文子串问题的。算法解释:将字符串之间插入同一个特殊字符,然后从前往后开始,p[i]数组代表以i为对称中心的字符串的长度(算上中心那个字符)。下面计算P[i],该算法增加两个辅助变量id和mx,其中id表示最大原创 2017-02-21 17:02:55 · 451 阅读 · 0 评论 -
hdu(1007) 最近点对 分治法
最近点对一般想到枚举 ,一一枚举时间复杂度为n^2;枚举时候一些炒作是多余的,有了分值算法的思想 ,把一些问题分个击破,再回到整体。题目链接 以这道题为例,我们可以把他按照x轴的升序分成多个子区域先在子区域中求最近点距离,然后将相邻两个子区域合并,看看两个子区域中有没有更小的。大致思想就是这样的。设计算法:递归将问题分成一小个问题。在找区域里面的最近点先将他按照原创 2016-04-04 19:14:14 · 818 阅读 · 0 评论 -
HDU-2255(KM算法)
KM算法原创 2016-11-14 21:20:04 · 548 阅读 · 0 评论 -
hdu2063 二分图(基础题)
这个题目适合刚刚接触二分图的同学做哦: 给一个题目链接 点击打开链接。题目大意,有K个男女匹配方式, 输入数据的第一行是三个整数K , M , N,分别表示可能的组合数目,女生的人数,男生的人数。01输出最大的男女匹配对数,匹配方式为,一个男生匹配一个女生; 题目思路: 先让1与能匹配到的男生进行匹配,用一个数组记录与该原创 2016-05-13 12:15:18 · 441 阅读 · 0 评论 -
ZIP压缩算法详细分析及解压实例解释
原创在:点击打开链接 最近自己实现了一个ZIP压缩数据的解压程序,觉得有必要把ZIP压缩格式进行一下详细总结,数据压缩是一门通信原理和计算机科学都会涉及到的学科,在通信原理中,一般称为信源编码,在计算机科学里,一般称为数据压缩,两者本质上没啥区别,在数学家看来,都是映射。一方面在进行通信的时候,有必要将待传输的数据进行压缩,以减少带宽需求;另一方面,计算机存储数据的时候,为了减转载 2016-06-12 14:12:46 · 3370 阅读 · 0 评论 -
欧拉图
欧拉图的判定欧拉通路和欧拉回路——必须是存在欧拉回路的图才能称为欧拉图,仅仅是存在欧拉通路不称为欧拉图 无向图的欧拉通路1.图连通可以用dfs去判断图连通或者用高效一点的并查集。用dfs的话其实就是遍历一遍图,并记录图有多少个连通分量,一般来说,在主函数中调用了多少次dfs就是有多少个连通分量。当连通分量数为1时说明图连通,大于1则不连通。用并查集的话,判断原创 2016-04-26 21:14:24 · 929 阅读 · 1 评论 -
背包问题(背包九讲)
背包问题九讲version 1.1 build 20071115前言 目录 第一讲 01背包问题 第二讲 完全背包问题 第三讲 多重背包问题 第四讲 混合三种背包问题 第五讲 二维费用的背包问题 第六讲 分组的背包问题 第七讲 有依赖的背包问题 第八讲 泛化物品 第九讲 背包问题问法的变化 附录一:USACO中的背包问题 附录二:背包问题的搜转载 2016-03-16 21:05:16 · 1190 阅读 · 0 评论 -
树状数组核心代码
int lowbit(int x){ return x&-x;}int add(int pos,int a){ while (pos<=n) { c[pos]+=a; pos+=lowbit(pos); } return 0;}int sum(int pos){ int ans=0; while (pos>0) { ans+=c[pos]; pos原创 2016-03-13 11:19:38 · 504 阅读 · 0 评论 -
看 迪杰斯特拉(Dijsktra)算法体会
迪杰斯特拉原创 2016-03-11 11:13:32 · 2399 阅读 · 0 评论 -
RMQ算法
对于这个算法,是求区间里面的最大最小值,一般思想在区间for循环一遍找,但是访问区间次数多的话,且区间长度太长,这样时间复杂度都会太长,我认为就是做了一个预处理使得访问时间大大减短。 怎么才能够得到区间的最值? 所以,如预处理区间的最大值,最小值也是类似的。用一个F二维数组F[ i ][ j ] 表示区间以 i 为起点长度为2^j次方 长度的区间的最大值。 这样处理了加入需要原创 2016-03-22 12:05:12 · 329 阅读 · 0 评论 -
邻接表的数组实现
之前我们介绍过图的邻接矩阵存储法,它的空间和时间复杂度都是N2,现在我来介绍另外一种存储图的方法:邻接表,这样空间和时间复杂度就都是M。对于稀疏图来说,M要远远小于N2。先上数据,如下。4 51 4 94 3 81 2 52 4 61 3 7复制代码 第一行两个整数n m。n表示顶转载 2016-03-31 12:36:39 · 829 阅读 · 1 评论 -
SPFA 最短路 带负权边的---- 粗了解
SPFA(Shortest Path Faster Algorithm)是Bellman-Ford算法的一种队列实现,减少了不必要的冗余计算。算法大致流程是用一个队列来进行维护。 初始时将源加入队列。 每次从队列中取出一个元素,并对所有与他相邻的点进行松弛,若某个相邻的点松弛成功,则将其入队。 直到队列为空时算法结束。这个算法,简单的说就是队列优化的bellman-ford,利用了原创 2016-04-26 21:28:19 · 3552 阅读 · 6 评论 -
公共子序列
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://karsbin.blog.51cto.com/1156716/966387最长公共子序列问题:给定2个字符串,求其最长公共子串。如abcde和dbada的最长公共字串为bd。动态规划:dp[i][j]表示A串前i个和B串前j个的最长公共子串的长度。转载 2016-05-02 09:53:59 · 562 阅读 · 0 评论 -
骨牌覆盖问题
骨牌覆盖问题,就是用 1x2 大小的骨牌,铺设一个给定大小的一个矩形区域,要求必须铺满,且不可以超出边界。问总的铺设方案数位多少? 这一类问题就是骨牌覆盖问题。不同规模的数据有不同的方法。 下面来看看最简单的 2×N 区域里面的铺设方法数。N=0,一种; N=1 为一种 ; N=2,两种;N=3,5种;较为容易看出是斐波拉原创 2016-06-06 14:29:45 · 5487 阅读 · 1 评论 -
nyoj 1279 (河南省第九届ACM比赛 D 题)
思路:变换一下坐标系新的坐标系就是给定的两条直线,变换之后求 x,y 都严格递增的点的个数的max;求 x,y 都严格递增的点的个数的max,按照x的从小到大排序,x相同的按照y的从大到小排序然后对y的值进行LIS#include#include#include#include#include#includeusing namespace std;typedef lo原创 2016-06-26 18:47:54 · 821 阅读 · 0 评论 -
堆排序-----数据结构
堆排序前不久,我们数据结构刚刚学习到,堆排序。个人觉得堆排序比较好,因为比较稳定的时间复杂度。n(logn) 时间复杂度。 如果想要学会堆排序,需要知道,二叉树。堆就和二叉树长的一模一样。下面说说堆排序:堆排序的思想就是用到堆的特点, 大顶堆,小顶堆,简单说, 大顶堆就是:这一棵完全二叉树的任意一个节点都满足该节点的值大于等于他的左右孩子节点,原创 2016-05-21 21:41:11 · 434 阅读 · 0 评论 -
骨牌覆盖问题 KxM
前面我们说了一些简单的骨牌覆盖问题,有了上面的经验,我们可以尝试解决K*M的思路和上一篇文章所提到的3*N的 很类似;依然是矩阵快速幂。我们需要把一个小的边固定下来作为的已知边,然后进行矩阵快速幂,要进行矩阵快速幂,我们需要知道初始矩阵,与构造出的递推矩阵;我们如何得到这两个矩阵?初始矩阵:矩阵宽度为 2^n 次方;第一排只可能出现,0或者横着放置,不过我们可以再退一步,原创 2016-06-06 20:36:20 · 1339 阅读 · 0 评论 -
hdu2544 迪杰斯特拉题目优化
点击打开题目链接迪杰斯特拉的用法不多讲,详见 点击打开链接 。下面两个代码:这个是用邻接矩阵存图的迪杰斯特拉。#includeint main(){ int e[1005][1005],dis[1005],book[1005],i,j,n,m,t1,t2,t3,u,v,min; int inf=9999999; while(scanf("原创 2016-04-24 21:29:51 · 412 阅读 · 0 评论 -
迪杰斯特拉--数组模拟邻接表优化
存图改用数组模拟邻接表的方式:数组模拟邻接表详见 邻接表的数组实现 。迪杰斯特拉 详见点击打开链接。#include #include #include using namespace std;const int MAX_SIZE=110;const int INF=2e9+1e8;int start[MAX_SIZE],terminal[MAX_SI原创 2016-04-24 10:42:18 · 448 阅读 · 0 评论 -
Floyd算法(弗洛伊德算法) 百度百科
状态转移方程其状态转移方程如下: map[i,j]:=min{map[i,k]+map[k,j],map[i,j]};map[i,j]表示i到j的最短距离,K是穷举i,j的断点,map[n,n]初值应该为0,或者按照题目意思来做。当然,如果这条路没有通的话,还必须特殊处理,比如没有map[i,k]这条路。时间复杂度与空间复杂度编辑转载 2016-03-09 21:15:48 · 1739 阅读 · 0 评论 -
矩阵快速幂 ——(递推表达式)
矩阵快速幂 首先知道矩阵 矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合; 矩阵乘法:定义:设A为 的矩阵,B为 的矩阵,那么称 的矩阵C为矩阵A与B的乘积,记作 ,其中矩阵C中的第 行第 列元素可以表示为:知道矩阵乘法之后,比如菲波那原创 2016-05-06 19:44:01 · 2430 阅读 · 0 评论 -
乘法逆元
如 a/b mod m 当a很大时, 就可以转化为 a*k mod m ;那么在什么情况下是等价的? 当 ( b*k ) mod m==1 的时候就有这个结论。证明过程详见 乘法逆元。原创 2016-05-13 10:43:05 · 385 阅读 · 0 评论