08 2018 档案

摘要:使用矩阵快速幂求斐波纳契数列 看来矩阵运算是十分好封装的,在这里计算斐波纳契数列是用到了矩阵的乘法和以矩阵作为数据类型实现的快速幂 看来矩阵甚至连结构体都不用写。。 阅读全文
posted @ 2018-08-31 22:11 静听风吟。 阅读(181) 评论(0) 推荐(0)
摘要:这个计数定理在考虑对称的计数中非常有用 先给出这个定理的描述,虽然看不太懂: 然后理解一下公式 一正方形分成4格,2着色,有多少种方案?其中,经过转动相同的图象算同一方案。 关于转动,一共有四种置换方法,也就是|G|=4 不动(360度):a1=(1)(2)…(16)逆时针转90度 :a2=(1)( 阅读全文
posted @ 2018-08-31 21:50 静听风吟。 阅读(1985) 评论(0) 推荐(0)
摘要:把所谓的树结构分成一块儿一块儿的? 当然这种数据结构并不强力,如果想要借助其分块儿的思想来解决问题,肯定有更好的其它的算法来替代它 所以,这里只是铺一个知识点探探路而已 典型例题BZOJ1086 题意就是把树分块儿 但是为何样例是错的? 其实递归的学问还是很大的 阅读全文
posted @ 2018-08-24 20:56 静听风吟。 阅读(597) 评论(0) 推荐(0)
摘要:这个东西看起来很棒棒的样子呀 bitset存储二进制数位 bitset就像一个bool类型的数组一样 bitset中的每个元素都能单独被访问 整数类型和布尔数组都能转化成bitset 有关Bitset的定义,运算以及相关的函数详见dalao的博客 https://www.cnblogs.com/Ra 阅读全文
posted @ 2018-08-24 20:36 静听风吟。 阅读(592) 评论(0) 推荐(0)
摘要:K-D树实际上是一棵高维二叉搜索树,与普通二叉搜索树不同的是,树中存储的是一些K维数据 普通的二叉搜索树是一维的,当推广到K维后,就是我们的K-D树了 在K-D树中跟二叉搜索树差不多,也是将一个K维的数据与根节点进行比较,然后划分的 这里的比较不是整体的比较,而是选择其中一个维度来进行比较 在K-D 阅读全文
posted @ 2018-08-24 20:23 静听风吟。 阅读(997) 评论(0) 推荐(0)
摘要:所谓的启发式合并就是合并的时候把小的东西往大的东西里面一个一个插 这里顺便说一下之前刷过去的线段树合并 对于一个结点,如果两颗线段树都有此位置的结点,则直接合并两结点的信息 然后递归处理左右子树 若只有一个有,直接返回即可 最坏的情况要合并n个结点,然后每个结点合并的时间复杂度是O(logn)的,那 阅读全文
posted @ 2018-08-24 19:45 静听风吟。 阅读(1644) 评论(0) 推荐(0)
摘要:可以说是线段树合并的裸题吧 题意就是给你两个操作 一个操作是合并两个集合,这两个集合都是用权值线段树维护的,便于查询第k小元素 另一个操作就是查询区间极值了 权值线段树的理解更加深刻了 权值线段树的下标是数字本身,而存的是这个数出现的次数,也就是权值 一般权值线段树都是和动态开点捆绑在一起的 所谓动 阅读全文
posted @ 2018-08-24 17:25 静听风吟。 阅读(295) 评论(0) 推荐(0)
摘要:紫书原题,UVA297 利用四叉树处理图片,给你两张黑白图片的四叉树,问两张图片叠加后黑色的面积 给出两颗四分树的先序遍历,求合并之后黑色像素的个数,p表示斑马结点,f表示黑色,e表示白色 四分树是一个神奇的树,只需要给出先序遍历就可以确定整棵树 四分树也可以用来实现二维线段树,只不过太恶心啦 有个 阅读全文
posted @ 2018-08-24 16:37 静听风吟。 阅读(1976) 评论(0) 推荐(0)
摘要:这里只支持查询不支持修改,总的时间复杂度为O((n+q)*√n) 阅读全文
posted @ 2018-08-24 15:50 静听风吟。 阅读(661) 评论(0) 推荐(0)
摘要:越来越高级了 区间重置非常好弄 此题的关键在于查询区间内一个数的个数 其实可以发现,在多次操作之后,整个序列就变成仅由几段不同数值所组成的序列了 我们可以维护每一个分块是否只有一种权值,在询问的时候,针对这种块可以O(1)统计答案 否则暴力统计然后修改标记,不完整的块暴力就可以了 阅读全文
posted @ 2018-08-23 20:13 静听风吟。 阅读(212) 评论(0) 推荐(0)
摘要:这里问题的关键是妥善处理好两种标记 让乘法标记的优先级高于加法 若当前的一个块乘以m1后加上a1,这时进行一个乘m2的操作,则原来的标记变成m1*m2,a1*m2 若当前的一个块乘以m1后加上a1,这时进行一个加a2的操作,则原来的标记变成m1,a1+a2 阅读全文
posted @ 2018-08-23 19:57 静听风吟。 阅读(466) 评论(0) 推荐(0)
摘要:典型的平衡树操作了 每一个块用动态数组维护,每次插入是找到对应的块 然后直接插,这个元素之后的数字都平移一位,如果用链表的话更好 如果块的大小不平衡了,要进行重新分块的 操作 每根号n次插入后,重新把数列平均分一下块 重构需要的复杂度为O(n),重构的次数为√n 也可以改变重构的方式,在某个块过大时 阅读全文
posted @ 2018-08-23 19:38 静听风吟。 阅读(414) 评论(0) 推荐(0)
摘要:在对整块儿进行开方操作的时候,因为块儿内每一个元素都有各自的特点,所以不好去统一维护 这题的修改就只有下取整开方,而一个数经过几次开方之后,它的值就会变成 0 或者 1 如果每次区间开方只不涉及完整的块,意味着不超过2√n个元素,直接暴力即可 如果涉及了一些完整的块,这些块经过几次操作以后就会都变成 阅读全文
posted @ 2018-08-23 19:15 静听风吟。 阅读(478) 评论(0) 推荐(0)
摘要:块儿外的元素还是暴力 为了快速求答案,要提前预处理每个块儿的元素和 区间修改的时候,不完整的块儿直接修改,顺便更新元素和 完整的块儿还是打标记 阅读全文
posted @ 2018-08-23 19:03 静听风吟。 阅读(871) 评论(0) 推荐(0)
摘要:刚才是查询比指定的数x小的数有多少个 这里是查询比指定的数x小的最大的那个数是啥 其实只要把块内查询的二分稍作修改即可 在块内维护其它结构使其更具有拓展性,比如放一个 set ,这样如果还有插入、删除元素的操作,会更加的方便 注意分块儿大小,瞎改容易RE 阅读全文
posted @ 2018-08-23 18:08 静听风吟。 阅读(332) 评论(0) 推荐(0)
摘要:本题的分块儿需要提前预处理,预处理的时候就是把每块儿内元素排序,这样在查询的时候就可以二分查找了,从而减少了查询的效率 当然对于块儿外元素还是暴力查找,最大查找2m次也就是2√n次 区间加法还是同样适用一个修改标记,但是对于首尾的不完整块儿在修改之后这两块儿可能会出现乱序的情况 重新排序一下就好了 阅读全文
posted @ 2018-08-23 17:51 静听风吟。 阅读(344) 评论(0) 推荐(0)
摘要:们把每m个元素分为一块,共有n/m块 每次区间加的操作会涉及O(n/m)个整块 以及区间两侧两个不完整的块中至多2m个元素 我们给每个块设置一个加法标记 每次操作对每个整块直接O(1)标记 不完整的块由于元素比较少,暴力修改元素的值 每次询问时返回元素的值加上其所在块的加法标记 这样每次操作的复杂度 阅读全文
posted @ 2018-08-23 17:34 静听风吟。 阅读(326) 评论(0) 推荐(0)
摘要:莫队算法是用来处理一类无修改的离线区间询问问题 莫队的精髓就在于,离线得到了一堆需要处理的区间后,合理的安排这些区间计算的次序以得到一个较优的复杂度 代表题目是BZOJ2038这道题 进行区间询问[l,r],输出该区间内随机抽两次抽到相同颜色袜子的概率 分母就是n*n(表示两两袜子之间的随机组合), 阅读全文
posted @ 2018-08-23 16:46 静听风吟。 阅读(195) 评论(0) 推荐(0)
摘要:一般的二叉堆支持的操作有插入任意值并调整堆,删除最小值并调整堆,调整堆之后我们可以O(1)取得最小的结点,这是相对于小根堆而言的 这里补充说明一下优先队列不能完成但是二叉堆可以完成的事情,那就是删除指定位置元素的值,优先队列只允许弹出堆顶元素 但是一般的二叉堆可以删除任意元素 这是对之前介绍的手写堆 阅读全文
posted @ 2018-08-23 16:22 静听风吟。 阅读(214) 评论(0) 推荐(0)
摘要:利用可持久化Trie树实现范围内取值异或最大值 如果标题没有表达清楚意思,可以看这里的题干: 然后根据异或的性质,异或一个数两次相当于没有异或,那么我们可以维护一个异或前缀和 有了异或前缀和之后我们就可以通过前缀和的形式O(1)提取出任意的一个异或区间出来 然后就可以把题目转化成这样的形式 求max 阅读全文
posted @ 2018-08-22 20:05 静听风吟。 阅读(694) 评论(0) 推荐(0)
摘要:利用01字典树查询最大异或值 01字典树的是只含有0和1两种字符的字典树,在使用它的时候,把若干数字转成二进制后插入其中 在查询树中的哪个数字和给定数字有最大异或值的时候,从根开始贪心查询就ok了 HDU4825是一道裸题:给出n个数和m次询问,每次询问给出一个数x,问在n个数中哪个数与x异或值最大 阅读全文
posted @ 2018-08-22 19:18 静听风吟。 阅读(573) 评论(0) 推荐(0)
摘要:首先吐槽一下,我刚开始找了一篇看起来很不错的模板代码,然后学习了一遍,然后直接WA 我发现博主的维护rnd的那里出毛病了,我改了之后最后一个点WA 然后发现,它没有copy结点,也就是没有可持久化,只是一颗无旋Treap而已。。 不说了,感谢引导我走向正确的作者:http://www.cnblogs 阅读全文
posted @ 2018-08-22 18:22 静听风吟。 阅读(422) 评论(0) 推荐(0)
摘要:POJ1182 有三种动物,告诉A类吃B类,B类吃C类,C类吃A类 告诉你X和Y是同类或者是X吃Y,然后问给出的信息有几条和前面相违背 在这里我们用三个并查集来维护,把每一种动物拆成三类(因为我不知道它到底属于哪一个类别) 以下图片转自:https://blog.csdn.net/backforwa 阅读全文
posted @ 2018-08-22 16:33 静听风吟。 阅读(354) 评论(0) 推荐(0)
摘要:在基础并查集上改良,让并查集支持回滚到历史版本 这里介绍一下普通并查集的两种优化,一个是路径压缩,一个是按秩合并(启发式合并) 路径压缩是在find上动手脚,让查询经过的点都直接与根相连,这样下次再查的时候复杂度就可以是O(1) 按秩合并是在union上动手脚,合并时让小集合拼接到较大集合上面,集合 阅读全文
posted @ 2018-08-22 15:54 静听风吟。 阅读(251) 评论(0) 推荐(0)
摘要:ETT可以称为欧拉游览树,它是一种和欧拉序有关的动态树(LCT是解决动态树问题的一种方案,这是另一种) dfs序和欧拉序是把树问题转化到区间问题上然后再用数据结构去维护的利器 通过借助这两种形式能够完成子树的查询和修改,这是LCT所不能胜任的工作 所谓的ETT就是通过动态维护欧拉序来实现动态树 它能 阅读全文
posted @ 2018-08-22 14:56 静听风吟。 阅读(894) 评论(0) 推荐(1)
摘要:BZOJ1269 上一篇文章介绍了Rope的简单应用,这里多了一个操作,区间翻转 同时维护一正一反两个rope……反转即交换两个子串 下面给出代码: Rope被称为可持久化平衡树,是因为它可以: 或者 也就是O(1)拷贝历史版本的平衡树,很完美的一个可持久化平衡树但是呢,数值操作不支持 我也不知道底 阅读全文
posted @ 2018-08-21 17:23 静听风吟。 阅读(746) 评论(0) 推荐(0)
摘要:以BZOJ1507为例,这里仅仅展示动态区间问题的一些典型操作,包括插入删除和修改,查询的话不支持按顺序查询 使用起来很简单很方便 当然还有另外的三个函数,这里附上 阅读全文
posted @ 2018-08-21 17:01 静听风吟。 阅读(725) 评论(0) 推荐(0)
摘要:在C++11以上的开发环境中,请直接把map替换成unordered_map,不要使用hash_map 之前我们专门有一篇介绍哈希表,多维哈希表的博文,当时就是以map举例子,然后说了一句把map替换成hash_map就好了 但是事实并非如此,在使用hash_map的时候还需要遵循两个规范 其一就是 阅读全文
posted @ 2018-08-21 15:40 静听风吟。 阅读(483) 评论(0) 推荐(0)
摘要:这里给出一个例题BZOJ1857,题意是这样的: 根据肯定知道最终的路径是一个这样形状的 关键就在于确定E和F点的位置 确定的时候控制变量,定E求F,定F求E 假设我们是定E求F,那么在AB上肯定存在一个点满足AF+FE最小 在这个最值点的左右两侧都不能得到最优的结果 如果把这个距离值反馈成函数那么 阅读全文
posted @ 2018-08-19 00:16 静听风吟。 阅读(1707) 评论(0) 推荐(0)
摘要:置换群是由置换组成的群。即n元集合Ω到它自身的一个一一映射 称为Ω上的一个n元置换或n阶置换 Ω上的置换 可表示为 典型例题是POJ2369,给定一个序列,问需要最少需要置换多少次才能变为有序序列 有了这个定理就可以做题了,我们求出每一个数的最小循环节,求LCM就好了 介绍一下什么是循环节: 1 2 阅读全文
posted @ 2018-08-18 11:46 静听风吟。 阅读(503) 评论(0) 推荐(0)
摘要:以上三句话是dalao总结的精髓 然后介绍一下定义: 对于任意数列 即用如下方法与一个函数联系起来: 则称G(x)是数列的生成函数 为了便于理解这个东西,下面给出几种典型应用: 使用母函数求出斐波那契数列的通项公式 若有1克、2克、3克、4克的砝码各一 枚,能称出哪几种重量?各有几种可能方案? 求用 阅读全文
posted @ 2018-08-18 11:21 静听风吟。 阅读(402) 评论(0) 推荐(0)
摘要:HDU4658:使用五边形数定理和母函数进行约束整数拆分 之前的那个一个题的公式是这样的: 加入了限制条件:拆分出来的整数中,任意整数都不能出现k次或k次以上 因此求的时候要使用公式的推导定理,母函数来求 1+x+x^2+... 其中的系数f[n]就是全由1组成的n有多少种 1+x^2+x^4+.. 阅读全文
posted @ 2018-08-17 10:58 静听风吟。 阅读(750) 评论(0) 推荐(0)
摘要:使用五边形数定理进行整数拆分 先介绍一个叫做分拆数的概念: 将一个数用一个或多个正整数的无序和来表示 例如4的分拆有5种:4 , 3+1 , 2+2 , 2+1+1 , 1+1+1+1 还有一个概念叫做限制分拆,就是给分拆加上限制条件,下面给出一些常见的结论 然后是要点总结部分,转自https:// 阅读全文
posted @ 2018-08-17 10:08 静听风吟。 阅读(1151) 评论(0) 推荐(0)
摘要:当C不是素数的时候,之前介绍的BSGS就行不通了,需要用到拓展BSGS算法 方法转自https://blog.csdn.net/zzkksunboy/article/details/73162229 典型例题是POJ3243 给哈希好评,哪天好好整理一下 阅读全文
posted @ 2018-08-17 09:41 静听风吟。 阅读(149) 评论(0) 推荐(0)
摘要:先来稍微回顾一下,我们已经会求模线性方程(包括其特殊情况乘法逆元) 我们还会进行幂取模的快速算法(模是质数用费马小定理,模一般情况用欧拉定理) 对于幂中指数特别大的情况,我们还延伸出了拓展欧拉定理来解决 对于模线性方程组来说,模数互质的时候直接用孙子定理 模数不互质的时候用方程合并的思想,引申出拓展 阅读全文
posted @ 2018-08-17 00:02 静听风吟。 阅读(234) 评论(0) 推荐(0)
摘要:POJ2115:利用拓展欧几里德算法求解模线性方程 我可不可以理解为中国剩余定理中n=1的情况呢? 对于C的for(i=A ; i!=B ;i +=C)循环语句,问在k位存储系统中循环几次才会结束 若在有限次内结束,则输出循环次数 否则输出死循环 设对于某组数据要循环x次结束,那么本题就很容易得到方 阅读全文
posted @ 2018-08-16 20:05 静听风吟。 阅读(321) 评论(0) 推荐(0)
摘要:就是这个东西,高数课上学过,然后要开洞脑筋在计算机上算这个东西 如果n比较大,打表会MLE,可以打跳表,也就是每40个数记录一次结果 如果n小的时候直接求就可以了 n大的时候有近似公式 下面给出实现:LightOJ1234 阅读全文
posted @ 2018-08-16 18:06 静听风吟。 阅读(1027) 评论(0) 推荐(0)
摘要:容斥原理ACM必考!!!!!! 容斥原理小学的时候就学过但是,这里考察容斥原理可不是画一画韦恩图就完事了 归根到底就是一句话,加上奇数个集合的并,减去偶数个集合的并 例题BZOJ2393 题意是这样的,给定一个范围,然后让你算一下有多少个数能被一种神奇的数组成 这种神奇的数只有2和9构成 首先预处理 阅读全文
posted @ 2018-08-16 17:44 静听风吟。 阅读(289) 评论(0) 推荐(0)
摘要:求法超级简单 关键是应用 这里给出四种最典型的应用: 但是不可能直接出这四种 肯定是你看不出来的,然后打表找规律发现是卡特兰数,应该是和递归息息相关的 阅读全文
posted @ 2018-08-16 17:08 静听风吟。 阅读(303) 评论(0) 推荐(0)
摘要:一个例题是POJ2478,给定一个数n,求在[1,n]这个范围内两两互质的数的个数 对于这个范围内的每一个数,我们只要找到不超过这个数且与这个数互质的数的个数就可以了 其实就是求欧拉函数 一个一个求的方法在欧拉定理部分有介绍,这里我们是要快速求这个欧拉函数 我在这里整理了两份,一份是利用性质求的,一 阅读全文
posted @ 2018-08-16 16:11 静听风吟。 阅读(321) 评论(0) 推荐(0)
摘要:回顾一下上节的欧拉定理: 其化简的形式为: a^φ(m)≡1(mod m) 就有: 看一道题: Given A,B,C, You should quickly calculate the result of A^B mod C. (1<=A,C<=1000000000,1<=B<=10^100000 阅读全文
posted @ 2018-08-16 11:34 静听风吟。 阅读(339) 评论(0) 推荐(0)
摘要:若n,a为正整数,且n,a互质,(a,n) = 1,则a^φ(n) ≡ 1 (mod n) 特别的φ(1)=1 费马小定理是欧拉定理的一种特殊情况 之前介绍的费马小定理是用来化简幂取模运算的,欧拉定理同样可以做到: a^x≡a^(x%φ(m))(mod m) 这样就可以了 之前的费马小定理是让指数部 阅读全文
posted @ 2018-08-16 11:13 静听风吟。 阅读(949) 评论(0) 推荐(0)
摘要:假如p是质数,且gcd(a,p)=1,那么 a^(p-1)≡1(mod p) 也就是a^(p-1) %p=1 据说它是欧拉定理的一种特殊情况,也就是 比较神奇,据说很出名很出名很出名 先回顾一下乘法逆元 x的最小整数解称为a模m的逆元 如果这个m是个质数,那么费马小定理就派上用场喽 这个时候x的最小 阅读全文
posted @ 2018-08-15 21:31 静听风吟。 阅读(1013) 评论(0) 推荐(0)
摘要:拓展中国剩余定理解决模数不互质同余方程组 如果模数互质的话,直接中国剩余定理就可以了 但是如果模数不互质又没有接触这个方法就凉凉了 推是很不好推出来的 假设我们这里有两个方程: x=a1∗x1+b1 x=a2∗x2+b2 a1,a2是模数,b1,b2是余数 那么我们可以合并这两个方程: a1∗x1+ 阅读全文
posted @ 2018-08-15 20:45 静听风吟。 阅读(206) 评论(0) 推荐(0)
摘要:据说是数论四大定理之一,它解决了一个实际问题: 一个整数除以三余二,除以五余三,除以七余二,求这个整数 也就是: 如果你知道同余方程的基本构成,理解同余方程组也就十分容易了 别看百科说了这么多,最有用的就最后一句话 我们接下来给出可以写程序的算法形式: 设正整数两两互素,则同余方程组 有整数解。并且 阅读全文
posted @ 2018-08-15 20:26 静听风吟。 阅读(894) 评论(0) 推荐(0)
摘要:一般情况下,输入需要外挂,输出用printf就好了 然后需要记住以下这个函数 当是long long 的时候,要改两个地方: 这个输入挂支持整数,任意整数都可以的 阅读全文
posted @ 2018-08-15 11:00 静听风吟。 阅读(145) 评论(0) 推荐(0)
摘要:乘法逆元应用在组合数学取模问题中,这里给出的实现不见得好用 给出拓展GCD算法: 有啥用呢?求解形如 a*x +b*y = c 的通解 然后我们先介绍同余方程,再介绍乘法逆元 其实介绍这个就是看怎么把≡拿掉 当满足这个式子的时候:a*x + b*y = c 有解的充要条件: c % gcd(a , 阅读全文
posted @ 2018-08-15 10:57 静听风吟。 阅读(593) 评论(0) 推荐(0)
摘要:利用Lucas定理解决大组合数取模 Lucas定理是用来求 C(n,m) mod p,p为素数的值。(注意:p一定是素数) Lucas定理用来解决大组合数求模是很有用的 Lucas定理最大的数据处理能力是p在10^5左右 递归方程:(C(n%p, m%p)*Lucas(n/p, m/p))%p。(递 阅读全文
posted @ 2018-08-15 10:13 静听风吟。 阅读(237) 评论(0) 推荐(0)
摘要:利用更相减损术求两个大数的最大公约数 这个题我没有过。。BZOJ1876 原因有这么几个: 如果使用十进制高精度配合普通更相减损术之后会T4个点 如果使用十进制高精度配合优化之后的更相减损术会T7个点 如果使用万进制高精度配合普通更相减损术会全T 最后一种不用再试了 原因我分析了一下,封装之后的十进 阅读全文
posted @ 2018-08-15 09:57 静听风吟。 阅读(1172) 评论(0) 推荐(0)
摘要:裴蜀定理也叫贝祖定理 说明了对任何整数a、b和它们的最大公约数d 关于未知数x和y的线性不定方程(称为裴蜀等式) 它的一个重要推论是:a,b互质的充要条件是存在整数x,y使ax+by=1 然后是推广到n个数的情况 特别来说,如果a1...an互质(不是两两互质) 那么存在整数x1......xn使得 阅读全文
posted @ 2018-08-14 20:42 静听风吟。 阅读(1567) 评论(0) 推荐(0)
摘要:埃筛在ACM中不可用 其实就是筛素数,我找到完整的名字了! 要得到自然数n以内的全部素数,必须把不大于 的所有素数的倍数剔除,剩下的就是素数 我找的例题比较神奇,它限制了空间1MB,这样的话假如我要找出第n个素数是什么,我筛的范围就要比n要大很多 但是到底大多少呢?不清楚,但是这个题空间限定了,只能 阅读全文
posted @ 2018-08-14 20:30 静听风吟。 阅读(295) 评论(0) 推荐(0)
摘要:有n种物品, 第i种物品有a个. 不同种类的物品可以互相区分, 但相同种类的无法区分 从这些物品中取出m个, 有多少种取法 求多重集组合数,并没有让枚举多重集组合 可是枚举应该怎么枚举呢?哈希判重? dp[i][j] 表示前i种物品,一共拿了j个物品的方法数 为了得到dp[i][j],那么可以从前i 阅读全文
posted @ 2018-08-14 18:28 静听风吟。 阅读(278) 评论(1) 推荐(1)
摘要:例子当然是王八棋这道题,这道题以前是写烂了 先来一个大暴力,zlw教的暴力~~ 当时真是幼稚地连搜索都写不利索 多维动态规划的意思就是状态有好几个维度,我们在定义状态的时候要开多维数组 这道题里面四种卡牌用了多少了是四种可行的状态,还有一个是当前走到了哪个格子,作为阶段 f[][][][][],然后 阅读全文
posted @ 2018-08-14 18:04 静听风吟。 阅读(793) 评论(0) 推荐(0)
摘要:记忆化搜索和递推都是为了解决子问题重复计算而产生的 虽然动态规划的转移图是一个DAG,但是一个状态可以被其他的状态复用多次 因此为了提高动态规划的效率,记忆化搜索便产生了 但是有时候,状态转移图是不容易描述的,这个时候我们就不能再称记忆化搜索是动态规划的一种实现了 它纯粹就是为了不再重复计算而已 比 阅读全文
posted @ 2018-08-14 17:52 静听风吟。 阅读(663) 评论(0) 推荐(0)
摘要:据说DAG是动态规划的基础,想一想还真的是这样的,动态规划的所有状态和转移都可以归约成DAG DAG有两个典型模型,一个是嵌套矩形问题一个是硬币问题,这里仅介绍一个嵌套矩形问题 等二轮复习的时候再补上 NYOJ16,南阳OJ很不错的样子嘛 如果矩形X可以嵌套到矩形Y中,连有向边X->Y 求DAG的最 阅读全文
posted @ 2018-08-14 11:47 静听风吟。 阅读(300) 评论(0) 推荐(0)
摘要:先给出状态转移方程: 这个可以优化到O(n^2)的时间复杂度,然后再滚动数组一下,空间复杂度就可以是O(n)的,这里直接给出最优实现策略 比SAM简单多了 阅读全文
posted @ 2018-08-14 11:09 静听风吟。 阅读(236) 评论(0) 推荐(0)
摘要:还是直接上转移方程: 动规只能解决O(n^2)的最长公共子串问题 使用后缀数组或者SAM可以高效地解决这个问题 所以,对于这个问题,动规的代码就不给出了 直接给出SAM的实现,也为以后学习SAM打下一个基础 具体做法是,对一个串建后缀自动机,把另一个串在自动机上跑,维护一下最大的匹配的长度就好了 我 阅读全文
posted @ 2018-08-14 10:56 静听风吟。 阅读(206) 评论(0) 推荐(0)
摘要:先上状态转移方程,还是很容易看明白的 例题是Codevs的1862,这个题不是实现了方程就可以了的,还要完成一个事情那就是计数,数一数到底有多少个最长公共子序列 在这里我们用dp记录长度,用f记录个数 由于输入是以“.”结尾的,所以读入的时候有些许的变化 这样读入的时候真正的字符串的下标是从a+1开 阅读全文
posted @ 2018-08-14 10:37 静听风吟。 阅读(232) 评论(0) 推荐(0)
摘要:最小生成树是最小斯坦纳树的一种特殊情况 最小生成树是在给定的点集和边中寻求最短网络使所有点连通 而最小斯坦纳树允许在给定点外增加额外的点,使生成的最短网络开销最小 BZOJ2595 题意是给定一个棋盘图。告诉你景点的位置 然后让你在一些格子上放置指定数量的志愿者使得景点之间可以连通 问你最少需要派遣 阅读全文
posted @ 2018-08-13 11:19 静听风吟。 阅读(449) 评论(0) 推荐(0)
摘要:数位dp一般应用于: 求出在给定区间[A,B]内,符合条件P(i)的数i的个数 条件P(i)一般与数的大小无关,而与 数的组成 有关 例题是一道BZOJ1833,让求出区间所有整数每个数字出现的次数 递推出f[i][j][k]表示长度为i开头j的所有数字中k的个数 这个东西让我想起了大模拟,高精度 阅读全文
posted @ 2018-08-13 09:41 静听风吟。 阅读(254) 评论(0) 推荐(0)
摘要:典型例题有三道: 没有上司的舞会 选课 景点中心 我们可以把动态规划的状态和转移描述成DAG 对于有根树来说,如果我们规定边的方向由父节点指向叶子节点 或者是由叶子节点指向父节点(奇葩) 那么它也是一个DAG 如果状态和转移都发生在特殊的DAG,树上 叫做树形动态规划 在树规中,父节点的值通过所有子 阅读全文
posted @ 2018-08-12 22:20 静听风吟。 阅读(236) 评论(0) 推荐(0)
摘要:划分型动态规划之数的划分 先贴上2014年10月31日的那份代码,甚至怀念当时在机房YY这道题的场面 高中最快乐的时候。。 很可爱的一道题 今天的重点是划分型动态规划 所谓的划分,可以说成一种模型吧。我可以把转移方程称为2D/0D么 阅读全文
posted @ 2018-08-12 22:01 静听风吟。 阅读(770) 评论(0) 推荐(0)
摘要:状压DP可以用在NP问题的小规模求解中(不理解,感觉和可以搜索的题很类似) 如果状态是个网格,数据范围很小,基本锁定状压DP 例题是BZOJ1725 题意是这样的,给定一个黑白图,然后种田,要求田与田之间不能挨着 而且只能往黑格子上种田 这个的意思让我联想到了棋盘动规的骑士游历和过河卒 或者是完全背 阅读全文
posted @ 2018-08-12 21:45 静听风吟。 阅读(314) 评论(0) 推荐(0)
摘要:我真是被自己菜哭了,只记住了两边BFS,还想着复习一下BFS怎么写来着 写完之后整个人都不好了,这是带权图的,丫的 立刻改成了SPFA,希望不要再犯这种错误 1A还是很愉快的 然后例题是一道骗小孩的题,给了个假数k,我还想着不用能不能A呢 结果还是很好了 题意: 有一颗n个结点的带权的无向树, 在s 阅读全文
posted @ 2018-08-11 22:55 静听风吟。 阅读(423) 评论(0) 推荐(0)
摘要:点分治我感觉是图论树部分比较考验脑力的一种题目了 POJ1741 题意:给一棵边带权树,问两点之间的距离小于等于K的点对有多少个 满足条件的点对有两种情况:两个点的路径横跨树根,两个点位于同一颗子树中 对于根节点进行一次dfs,求出deep,并将其从小到大排序 然后看一下calculate 如果我们 阅读全文
posted @ 2018-08-11 22:21 静听风吟。 阅读(185) 评论(0) 推荐(0)
摘要:先象征性地描述一下问题:一组(或者一个)东西有且仅有两种选择,要么选这个,要么选那个,还有一堆的约束条件 图论问题,当然是建边跑图喽 给出模型: 题目POJ3683 然后说一下这个题的意思: 如果某两个婚礼进行仪式的时间有重合 那么就存在了矛盾关系,通过这些关系连边 Tarjan缩点重新建图(这里建 阅读全文
posted @ 2018-08-10 22:57 静听风吟。 阅读(245) 评论(0) 推荐(0)
摘要:本来A*就可以搞定的题,为了怕以后卡复杂度,找了个这么个方法 现阶段水平不够就不补充算法分析部分了 本题难度爆表,低级图论和高级数据结构的大综合 直接上代码了,以后学的多了再回过头来看方法 200多行幸亏没出什么调不出来的错误,唉,菜啊 阅读全文
posted @ 2018-08-10 18:56 静听风吟。 阅读(1143) 评论(0) 推荐(0)
摘要:被自己菜到了,printf加取地址符调到吐血 POJ3255的次短路问题 算法原理是这样的: 然后给出实现,我直接在原来的板子的基础上改的 真的是,无向图真坑 阅读全文
posted @ 2018-08-10 17:11 静听风吟。 阅读(179) 评论(0) 推荐(0)
摘要:POJ3241:求曼哈顿距离最小生成树上第k大(第n-k小)的边 这么难的建模只能抄下来了 好难啊 给出曼哈顿最小生成树的定义:给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价 显然这个图论题要结合解析几何或者是计算几何的一些东西了 首先给出一个结论:以一个点为原 阅读全文
posted @ 2018-08-10 15:18 静听风吟。 阅读(279) 评论(0) 推荐(0)
摘要:最小瓶颈路的意思是已经告诉你起点和终点了然后让你求瓶颈,最小瓶颈生成树呢是让你求出连通所有点的 所以最小瓶颈路求起来更快 例题UVA534 然后加入有T组询问,你就要提前预处理出所有的 这个方法在求次小生成树的代码里有体现,直接抄过来就好了 本质上是预处理出f数组 然后给出完整的实现: 阅读全文
posted @ 2018-08-10 11:09 静听风吟。 阅读(391) 评论(0) 推荐(0)
摘要:最小瓶颈生成树不一定是最小生成树,但最小生成树一定是最小瓶颈生成树 由于关心最大边便把边从小到大排序,最先生成的那棵生成树就是答案。而这就是Kruskal算法,所以原图的最小生成树就是一棵最小瓶颈生成树了 感觉这个解释很牵强呀 不过知道结论就舒服多了 题目是BZOJ2429 这里看一下返回的结果就知 阅读全文
posted @ 2018-08-10 10:46 静听风吟。 阅读(1038) 评论(0) 推荐(0)
摘要:先求出MST。再枚举新加的一条边(u,v),这时成环便去掉(u,v)所在环上,即u到v的路径上的权值最大的边(不删(u,v)这个新增的边)。这样就是答案了 次小生成树一定至少有一条边与最小生成树不一样,那么存在不同于最小生成树的生成树中权值和最小的生成树就是次小生成树 处理出每对结点(u,v)的最小 阅读全文
posted @ 2018-08-10 10:15 静听风吟。 阅读(185) 评论(0) 推荐(0)
摘要:利用SPFA+EK算法解决费用流问题 例题不够裸,但是还是很有说服力的,这里以Codevs1227的方格取数2为例子来介绍费用流问题 这个题难点在建图上,我感觉以后还要把网络流建模想明白才能下手去做这种题,老实说挺难的 先直接给出建图的代码: 然后给出完整实现,请记住cnt初始必须是1,为了和^配套 阅读全文
posted @ 2018-08-09 17:37 静听风吟。 阅读(346) 评论(0) 推荐(0)
摘要:解决最大流问题我搜到了一堆的算法:EK算法、FF算法、Dinic算法、SAP算法、ISAP算法 然而并没有什么鸟用 掌握最常见的Dinic就够了,据说极限优化的ISAP比Dinic更快一些。。我当不知道好了 模板题Codevs1993 给定源点汇点,求从源点走到汇点的所有流量和,最大流就是求最大值了 阅读全文
posted @ 2018-08-09 14:59 静听风吟。 阅读(449) 评论(0) 推荐(0)
摘要:利用Stoer-Wagner算法求无向图最小割 直接给出算法描述和过程实现: 然后题目POJ2914的意思是去掉一些边使原图变成两个连通分量并且去掉边的权值之和最小,如果要是去掉的边最少的话让所有边权值为1就好了 v表示经过合并之后的节点,d表示w(A,v[i]) 然后直接给出实现: 像这种完全成熟 阅读全文
posted @ 2018-08-09 14:20 静听风吟。 阅读(546) 评论(0) 推荐(0)
摘要:Gale-Shapley算法又叫做延迟认可算法,它可以解决这么一个问题 一共有N位男士和N位女士 每位男士对每位女士都有一个好感度,让他们结合成为N对夫妻,要求男士优先表白,最后问结合情况 以上给出了算法的描述,下面直接给出代码,题目是POJ3487 由于这个问题没有太大变式直接套模板就好了,如果要 阅读全文
posted @ 2018-08-09 11:24 静听风吟。 阅读(2891) 评论(0) 推荐(0)
摘要:使用最大流和费用流解决二分图的多重匹配 之前编辑的忘存了好气啊。。 本来打算学完二分图的乱七八糟的匹配之后再去接触网络流的,提前撞到了 之前我们说的二分图最大匹配和二分图最大权匹配有一个特点,那就是没个点只能与一条边相匹配 如果规定一个点要与L条边相匹配,这样的问题就是二分图的多重匹配问题 然后根据 阅读全文
posted @ 2018-08-08 09:50 静听风吟。 阅读(2495) 评论(0) 推荐(0)
摘要:如果,将求二分图的最大匹配的所有匹配边的权重看做1 那么用匈牙利算法求二分图的最大匹配的问题也可以看成求二分图的最大权匹配 如果边权是特例,我们就要使用KM算法来做了 这个算法其实还是比较难的,会用就不错了,更不要说证明了 这里以HDU2255为例,这是一个裸题 在这个题目里面X和Y的size是一样 阅读全文
posted @ 2018-08-07 20:43 静听风吟。 阅读(886) 评论(0) 推荐(0)
摘要:其实在写这个的代码的时候我是纳闷的,X集合和Y集合的点,能同时用1,或者2来表示吗? 然后我努力说服自己:它已经是二分图了 它就是存了一个 → 而已 好的我被自己说服了 二分图匹配说的就是,每个人有若干种选择,但是每种选择只能容纳一个人,问你最多能配对多少 或者说成选边的时候不能经过同一个点 最大匹 阅读全文
posted @ 2018-08-06 23:17 静听风吟。 阅读(1255) 评论(0) 推荐(0)
摘要:我其实只是想练一练二分图判定的,但是翻到了一个这么个题。。 双栈排序早有耳闻,非常欣赏当年的出题水平,堪称经典 这个题AC的人一定是个天才 废话不多说,双栈排序的思路我就不介绍了,没有那个水平,直接来说说怎么二分图染色 这个方法,14年的时候练了很多次,当时习惯写BFS的,可能是因为所有点都要跑所以 阅读全文
posted @ 2018-08-06 22:39 静听风吟。 阅读(583) 评论(0) 推荐(0)
摘要:POJ2942:利用Tarjan求无向图的点双连通分支 首先科普一下点双连通分支的求法: 貌似看起来繁琐而复杂。。 然而复杂的确实这道例题,暂时没有找到特别裸的。。 题干大意是这样的,开会,然后给出了一张图,边所连接的两个点互相憎恶,开会的时候只能奇数个人一起圆桌开,问T几个人会世界和平 做法的话, 阅读全文
posted @ 2018-08-06 21:28 静听风吟。 阅读(692) 评论(0) 推荐(0)
摘要:POJ3177:利用Tarjan求无向图的边双连通分支 连通图去掉所有的桥(割边)之后,剩下的就是一块儿一块儿的边双连通分支了 那么这道题的描述是给定无向图G,问至少加入多少条边才能让原图成为一个双连通图 这个题的做法是利用Tarjan求出图中的所有桥,以桥为界限分出来的就是一个一个边的双连通分量 阅读全文
posted @ 2018-08-06 16:48 静听风吟。 阅读(1112) 评论(0) 推荐(0)
摘要:POJ2186:利用Tarjan强连通分量求缩点重构图 缩点就是在求出图的所有的强连通分量之后 把强连通分量都看成一个点 这样形成的一个新的图叫做缩点重构图 下面描述一下POJ2186的题意: 给出n个点和m条边(点与点之间的关系),关系具有传递性,问最后有多少点满足其他所有点都能够通达到此 首先我 阅读全文
posted @ 2018-08-06 11:01 静听风吟。 阅读(669) 评论(0) 推荐(0)
摘要:Luogu2863:利用Tarjan求有向图的强连通分量 强连通分量这这样的一个子图: 图中的任意两点都可以相互通达,它是有向图 这里的例题题意是这样的,统计所有强连通分量中,至少包含两个点的强连通分量的数量 这里面把强连通分量的点放在st栈里,用vis进行存在性标记 col的意思是下标属于哪一个强 阅读全文
posted @ 2018-08-06 10:14 静听风吟。 阅读(177) 评论(0) 推荐(0)
摘要:UVA796:利用Tarjan求无向图的割边(桥) Tarjan求割边和求割点的差异不大 这里有的变量在上一篇博文中已经介绍过了 我们看到mp映射是用来替代二维数组进行判重的 本来打算换成hash_map但是发现并不好用,这是个必须要补的坑 这里的判重是判断是否有重边,由于权重都是1所以并不需要进行 阅读全文
posted @ 2018-08-06 09:47 静听风吟。 阅读(502) 评论(0) 推荐(0)
摘要:Luogu3388:利用Tarjan求无向图的割点 割点就是维护双连通分量的一个点,如果删去的话,原本的双连通分量就会被拆成若干个连通分量 利用Tarjan算法可以求出无向图的所有割点 下面介绍一下: 邻接表建图,开二倍边长(无向图) deep用来跟踪记录每一个点的深度,或者说,它在dfs中是第几个 阅读全文
posted @ 2018-08-05 22:20 静听风吟。 阅读(225) 评论(0) 推荐(0)
摘要:运用矩阵树定理进行生成树计数 给定一个n个点m条边的无向图,问生成树有多少种可能 直接套用矩阵树定理计算即可 矩阵树定理的描述如下: 首先读入无向图的邻接矩阵,u-v G[u][v]++ G[v][u]++ 度数矩阵: u-v D[u][u]++ D[v][v]++; 然后计算图G的基尔霍夫矩阵 C 阅读全文
posted @ 2018-08-05 16:14 静听风吟。 阅读(310) 评论(0) 推荐(0)
摘要:BZOJ1430:运用Cayley定理解决树的形态统计问题 由Prufer编码可以引申出来一个定理:Cayley 内容是不同的n结点标号的树的数量为n^(n-2) 换一种说法就是一棵无根树,当知道结点总数的时候,其最多可能有n^(n-2)种形态 这只是形态而已 对于BZOJ1430这道题 题目的打架 阅读全文
posted @ 2018-08-05 15:26 静听风吟。 阅读(175) 评论(0) 推荐(0)
摘要:BZOJ1211:使用prufer编码解决限定结点度数的树的计数问题 首先学习一下prufer编码是干什么用的 prufer编码可以与无根树形成一一对应的关系 一种无根树就对应了一种prufer编码 先介绍编码过程: 选择无根树中度数为1的最小编号节点(也就是编号最小的叶子节点),将其删除,把它的邻 阅读全文
posted @ 2018-08-05 11:46 静听风吟。 阅读(574) 评论(0) 推荐(0)
摘要:HDU4010 类比静态区间问题->动态区间问题的拓展 我们这里把区间变成树,树上的写改删查问题,最最最常用LCT解决 LCT用来维护动态的森林,对于森林中的每一棵树,用Splay维护。 LCT是把这些Splay关联在一起的数据结构 我们以HDU4010为例子 这里把树存成了图,邻接表表示,对于森林 阅读全文
posted @ 2018-08-04 15:15 静听风吟。 阅读(421) 评论(0) 推荐(0)
摘要:BZOJ1602 求最近公共祖先有三种常用的方法,在线的有两种,分别是树上倍增算法和转化为RMQ问题 离线的有一种,使用Tarjan算法 这里,我们介绍复杂度优异并且在线的倍增算法,至于后续的两种方法等到之后接触了相关方面的内容之后再进行补充,到时候写一篇总结 我们在计算树上的两点的最短路径时,如果 阅读全文
posted @ 2018-08-04 14:15 静听风吟。 阅读(655) 评论(0) 推荐(0)