算法学习
文章平均质量分 59
pengwill97
C.S Master
展开
-
算法学习 拓扑排序(TopSort)
拓扑排序一、基本概念在一个有向无环图(Directed Acyclic Graph, DAG)中,规定< u,v > 表示一条由u指向v的的有向边。要求对所有的节点排序,使得每一条有向边 < u,v>中u都排在v的前面。 换个形象点的解释,我们在学习一门课程之前,应该需要一定的预备知识,比如在学习B课程之前我们需先学习A(后用< X,Y > 表示X课程是Y课程的预备知识,其实与上述有序偶的含义相原创 2017-04-03 14:39:03 · 4022 阅读 · 0 评论 -
【算法学习】字符串Hash进阶
这回主要看看出题人卡Hash的心机,图片均转载自Hash更进一步(Hash字符串——BDKRHash)。原创 2018-07-03 21:42:27 · 342 阅读 · 0 评论 -
【算法学习】主席树入门
主席树入门原理主席树入门主席树,也叫做可持久化线段树,准确来说,应该叫做可持久化权值线段树,因为其中的每一颗树都是一颗权值线段树。所谓权值线段树,就是指线段树的叶子节点保存的是当前值的个数。这样说起来比较抽象,下面用具体例子来简单阐述。如有数列:2 1 2 5 1 1 1 3,不难统计出,数列中数字1出现了4次,数字2出现了2次,数字3、数字5都出现了1次,对于这...原创 2018-07-04 23:30:03 · 20599 阅读 · 9 评论 -
【算法学习】Splay入门
Splay变量声明基本操作clearget操作update操作复杂操作rotate操作Splay操作insert操作find操作findx操作next & pre操作del操作Splay变量声明f[i]f[i]f[i] 表示iii的父节点 ch[i][0]ch[i][0]ch[i][0]表示iii的左儿子,ch[i][1]...原创 2018-07-11 21:06:03 · 345 阅读 · 0 评论 -
【算法学习】Polya定理及其计数
转载自 https://blog.csdn.net/nameofcsdn/article/details/53321264原创 2018-08-08 17:13:09 · 975 阅读 · 0 评论 -
【算法学习】2-SAT
2-SAT2-SAT一般给出nnn个布尔变量(取0或者取1),再给出mmm个关于这些布尔变量的约束条件(见下文),求出是否能找到解满足这些约束条件。2-SAT可以建图,转换成强连通分量进而判断矛盾问题。对于布尔变量,只有2个取值,取0或者取1,所以对于任意一个布尔变量xixix_i,我们可用其原变量iii(即取1值)和其反变量i′i′i'(即取0值)依据约束条件来构建图。约束条件...原创 2018-08-26 20:01:06 · 3917 阅读 · 0 评论 -
【算法学习】连通分量、割顶与桥、双连通分量、强连通分量
连通分量连通分量:需要保存边用dfs,不需要保存边用并查集二分图二分图:非连通图是二分图当且仅当每个连通分量都是二分图。 一个连通图是二分图,当且仅当它可以二染色。 一个连通图是二分图,当且仅当它不含奇数环,所谓奇数环,即环上的点(或边)个数为奇数。反证法证明一个二分图当且仅当不含奇数环。证明: 假设二分图含有奇数环,设顶点编号分别为x1,x2,x3…,x2k−1x1...原创 2018-08-22 21:32:01 · 863 阅读 · 1 评论 -
【算法学习】树的重心与点分治
树的重心树的重心也叫做树的质心。其本质是一个点,删除这个点后,形成的子树中最大的节点数目最小。解法一遍dfs即可。dfs的时候记录一下当前节点uuu的size[u]size[u]size[u],同时记录他的所有儿子子树中的最大节点数目mxchildmxchildmxchild,那么删除当前节点uuu所形成的子树就是max(mxchild,n−size[u])max(mxchild,n−...原创 2018-08-31 19:58:03 · 1396 阅读 · 0 评论 -
【算法学习】点分治的两种写法与常见套路总结
概述点分治是一种基于树的重心,统计树上路径的优秀算法。将树上的路径分为经过树的重心和不经过树的重心两种,同时利用树的重心性质,使得递归深度不超过lognlognlogn次。总时间复杂度取决于每次递归统计答案的时间复杂度。若每次统计是O(n)O(n)O(n)的,那么总时间复杂度是O(nlogn)O(nlogn)O(nlogn)。若统计的时间复杂度是O(nlogn)O(nlogn)O(nlogn)...原创 2018-09-09 21:00:30 · 2632 阅读 · 0 评论 -
【算法学习】网络流模型与套路
网络流常见模型最大权闭合子图定义:图中每个点有点权,或正或负。在选择一个点后,必须选择某些后继点。一般情况求最大的收益。建图:对于点权为正的点(一般为收益),源点SSS向正权点连边,容量为点的权值。对于点权为负的点(一般为花费),向汇点TTT连边,容量为负权绝对值。对于要选择后继关系的点,前驱点向后继点连边,容量为infinfinf。跑最大流,求出最小割。最终答案 = 正权点之和 - 最小割...原创 2018-09-18 22:33:20 · 832 阅读 · 0 评论 -
【算法学习】左偏树
左偏树左偏树是一种可以快速合并的可并堆,相对于普通的二叉堆,左偏树的合并可以做到log(p1+p2)log(p_1 + p_2)log(p1+p2),是一种十分优秀的数据结构。性质左偏树是一种可并堆的实现,是一颗二叉树,它除了有二叉树的左右儿子,还有2个属性,键和距离。下面是左偏树的一些基本性质。节点的键值小于或等于左右子节点的键值。这是左偏树的堆性质。节点的左子节点的距离不小于右...原创 2018-09-27 22:05:23 · 3762 阅读 · 2 评论 -
【算法学习】分块算法入门
分块算法入门如何写分块(一)维护内容每一块的个数块的总数目块的左右端点位置每个元素所属于的块号完整代码如何写分块(二)思维的转换如何训练分块算法入门所谓分块算法,就是讲一个序列分成若干块,维护块内的信息。为了保证一定的时间复杂度,所以对于一个nnn个元素组成的数组,将其分为n−−√n\sqrt{n}块,每块也有n−−√n\sqrt{n}个元素...原创 2018-07-03 16:45:33 · 7526 阅读 · 3 评论 -
【算法学习】KMP入门
KMP算法入门next数组的求解next数组的含义next数组求解代码如何进行匹配KMP算法入门KMP解决的是模式串SSS和文本串TTT之间的匹配问题。传统和暴力算法,在复杂度方面不够优秀,根本原因在于对模式串没有的规律没有加以利用,导致进行了多余的匹配。而KMP算法的关键也在于nextnextnext数组,求解出了模式串nextnextnext数组,也就求解出...原创 2018-07-09 21:59:28 · 147 阅读 · 0 评论 -
算法学习 并查集(Union-Find) (转)
并查集是我暑假从高手那里学到的一招,觉得真是太精妙的设计了。以前我无法解决的一类问题竟然可以用如此简单高效的方法搞定。不分享出来真是对不起party了。(party:我靠,关我嘛事啊?我跟你很熟么?) 来看一个实例,杭电1232畅通工程 首先在地图上给你若干个城镇,这些城镇都可以看作点,然后告诉你哪些对城镇之间是有道路直接相连的。最后要解决的是整幅图的连通性问题。比如随意给你两个点,让你判断它们转载 2017-04-30 12:19:28 · 220 阅读 · 0 评论 -
STL之map
Map概述Map是STL的一个关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可能称为该关键字的值)的数据处理能力,由于这个特性,它完成有可能在我们处理一对一数据的时候,在编程上提供快速通道。这里说下map内部数据的组织,map内部自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能,所以在map内部所有的数据都是有序的,后边我们会原创 2016-11-18 20:35:03 · 528 阅读 · 1 评论 -
大话算法之动态规划——初探
对于动态规划,之前学习过了,但是总感觉理解不深刻。今天正好讲道动态规划算法,感觉有了一些新的认识和看法,打算详细的写下来,一是帮助自己理清,二是希望给刚刚接触的ACMer一个简明的理解思路吧。大话算法之动态规划——初探一、引例: 数塔问题之所以好多地方均以这个东西作为例子,我想能是因为这个问题首先是易于理解,其次就是一定有解动态规划问题的通性。举一反三,就不难学习一个新的算法了,重点就在于,这个算法原创 2017-05-15 21:43:38 · 888 阅读 · 1 评论 -
容斥原理、鸽巢原理快速入门
一、容斥定理基本描述在计数时,必须不重不漏。为了使得重叠部分不被重复计算,人们研究出一种新的计数方法,这种方法的基本思想是:先不考虑重叠的情况,把包含于某内容中的所有对象的数目先计算出来,然后把计数时重复计算的数目排斥出去,使得计算的结果既无重复也无遗漏,这种计数的方法称为容斥原理。公式表述公式的解释: 目的是求解m个集合的并集,首先将m个集合相加,减去集合间两两相交的部分,加上三三相交的部分,再原创 2017-08-07 10:05:46 · 481 阅读 · 0 评论 -
博弈论快速入门
一、巴什博奕(Bash Game)基本描述:只有一堆n个石子,两个人轮流从这堆石子中取石子,规定每次至少取一个,最多取m个,最后取完的人获胜。分析:当n <= m的时候,显然先手获胜,因为一次就能取完。当n = m+1 的时候,由于先手最多取走m个,无论其取走多少个,剩下的后手均可以一次取完,显然后手胜。根据以上分析,我们可以将n写成 n = (m+1) * r + s 的形式。对于先手玩家原创 2017-08-06 23:49:04 · 2879 阅读 · 4 评论 -
线性筛法与欧拉函数
线性筛法与欧拉函数标签(空格分隔): 数论一、引入我们已经很熟悉Eratosthenes筛法(埃拉托斯特尼筛法),其基本思想是,每次筛去一个指数的所有倍数,如对于质数2,筛去4,6,8等等,对于质数3,筛去6,9,12等等。 其弊端也显而易见,6和12等等数字,均被筛去的多次,这样就造成了重复,复杂度不够好。 有没有更快的筛法,当然有。二、说在前面对于任何一个数字,我们都能利用唯一分解定理将其拆原创 2017-08-23 18:28:34 · 1101 阅读 · 0 评论 -
高斯消元快速入门
高斯消元快速入门一、基本描述学习一个算法/技能,首先要知道它是干什么的,那么高斯消元是干啥的呢? 高斯消元主要用来求解线性方程组,也可以求解矩阵的秩,矩阵的逆。在ACM中是一个有力的数学武器.它的时间复杂度是n^3,主要与方程组的个数,未知数的个数有关。 那么什么是线性方程组呢? 简而言之就是有多个未知数,并且每个未知数的次数均为一次,这样多个未知数组成的方程组为线性...原创 2017-08-15 21:32:11 · 31246 阅读 · 13 评论 -
0-1分数规划
是什么0-1分数规划解决这样一类问题。给定一些元素,可以进行选取,选取有好处(b)和花费(c),最后求好处的和与花费的和的比例最大或最小。 用r来表示比例,x[i]x[i]x[i]来表示对应元素是否选择,取值为0,即为选择,取值为1即为不选择,那么问题就变成了: r=∑b[i]∗x[i]∑c[i]∗x[i]r=∑b[i]∗x[i]∑c[i]∗x[i]r = \frac{\sum{b[i] ...原创 2018-04-19 22:11:54 · 152 阅读 · 0 评论 -
【算法学习】RMQST算法入门
RMQRMQ问题是区间最值问题(Range Maximum / Minimum Query),即给出一个数组A1…AnA1…AnA_1 \dots A_n,给出一个询问区间l,rl,rl,r,求出[Al,Ar][Al,Ar][A_l,A_r]的区间最值。 最暴力的做法肯定是循环,这样显然不够优秀,求解区间最值的问题,可以借助线段树。在询问只是询问时复杂度多一个log。对于没有修改操作的区间最...原创 2018-05-23 16:39:01 · 259 阅读 · 0 评论 -
【算法学习】字符串Hash入门
字符串Hash入门Hash方法自然溢出方法Hash公式单Hash方法Hash公式举例双Hash方法Hash公式获取子串的Hash例子公式字符串Hash的应用字符串Hash入门字符串Hash可以通俗的理解为,把一个字符串转换为一个整数。如果我们通过某种方法,将字符串转换为一个整数,就可以便的确定某个字符串是否重复出现过,这是最简单...原创 2018-07-02 01:41:35 · 23127 阅读 · 18 评论 -
【算法学习】FHQ Treap (无旋Treap)
FHQ Treap简介FHQ Treap和普通的Treap都是一个二叉搜索堆,其同时满足二叉树的性质(左子树的权值小于等于当前节点权值,右子树权值大于当前节点权值)和堆的性质(对于小根堆,当前节点的优先级是堆中最小的)。FHQ Treap与一般的Treap的不同之处主要在于:不用旋转,用split和merge来为维护堆的优先级。能够可持久化。操作FHQ Treap的核心操作是sp...原创 2018-09-28 22:53:33 · 5055 阅读 · 1 评论