算法
文章平均质量分 95
学算法很容易的,就是有点废头发???如果文章对你有帮助,记得点赞收藏关注~
吾仄lo咚锵
吴泽龙的博客
展开
-
程序设计竞赛-过了这个村没这个店
初闻不知曲中意,再闻已是曲中人。标题无意夸张,但是竞赛生涯的时间真的不长,机会真的错过了就没有了。原创 2022-09-18 21:15:02 · 6903 阅读 · 11 评论 -
八大排序-上次看到这么好的排序博客还是在上次
本文将用说人话+动图的形式带你搞懂常见排序算法,简要分析复杂度、稳定性等指标,并给出参考代码。最后安利sort()函数的使用。原创 2021-10-24 23:56:05 · 8147 阅读 · 7 评论 -
字符串-回文自动机
回文自动机(Palindromes_Automaton,PAM),也叫回文树,是高效解决回文问题的算法,能够解决很多Manacher算法解决不了的回文题。可以解决如回文串个数、本质不同回文串个数、前缀0-i内回文串个数、某下标结尾的回文串个数等。原创 2021-06-03 14:43:32 · 4477 阅读 · 4 评论 -
动态规划-RMQ问题(ST算法)
RMQ(Range Minimum/Maximum Query)问题,是求区间最大值或最小值,即范围最值问题,有一种更简便的ST算法,预处理复杂度是O(nlogn),查询O(1)。文章目录RMQ问题ST算法模板例题P2251 质量检测P1816 忠诚P2216 [HAOI2007]理想的正方形原创 2021-05-22 17:29:58 · 5049 阅读 · 14 评论 -
字符串-Manacher算法(你知道马拉车算法吗?)
马拉车算法当然不是马拉着车的奇奇怪怪的东西,是Manacher’s Algorithm的音译。马拉车算法是一种可以在O(n)线性时间内求最长回文子串的算法。例题P3805 【模板】manacher算法P1659 拉拉队排练原创 2021-05-17 23:20:06 · 1533 阅读 · 11 评论 -
字符串-后缀树和后缀数组详解
后缀树和后缀数组可以解决大部分字符串问题。光速从入门到放弃,看这一篇就够了。例题:HDU-1403最长公共子串洛谷P2408 不同子串个数HDU-5769Substring原创 2021-05-16 20:50:10 · 4257 阅读 · 4 评论 -
数组面试题-大力出奇迹?
不要小看小小的数组,虽然暴力做法大家都会,但是复杂度最优才是硬功夫。暴力出奇迹,但是无Offer。文章目录数组中重复的数字二维数组中的查找旋转数组的最小数字调整数字顺序使奇数位于偶数前面数组中出现次数超过一半的数字最小的k个数连续子数组的最大和数字序列中某一位的数字把数组排成最小的数和为s的数字数组中数字出现的次数原创 2021-04-06 21:21:39 · 5111 阅读 · 14 评论 -
二叉树面试题-你已经是棵成熟的二叉树了,要学会自己解题
除了链表,另一个面试常客莫属二叉树了。链表面试题(动图详解)-明明做出来了却为什么没有Offer?你已经是棵成熟的二叉树了,要学会自己解题。文章目录二叉树的深度二叉搜索树的第k大节点从上到下打印二叉树二叉树的镜像对称的二叉树树的子结构重建二叉树二叉树的下一个节点二叉搜索树的后序遍历路径二叉树中和为某一值的路径二叉搜索树与双向链表原创 2021-04-03 21:49:13 · 5218 阅读 · 21 评论 -
链表面试题(动图详解)-明明做出来了却为什么没有Offer?
面试题明明做出来了,为什么最后没有Offer?虽然实现了功能,但是可能忽略了性能和细节,比如说复杂度、边界条件、空指针等。就是所谓的鲁棒性(Robus)问题,本文将介绍几个经典链表面试题。文章目录从尾到头打印链表反转链表O(1)删除链表节点链表中倒数第k个节点链表中环的入口节点合并两个排序的链表复杂链表的复制两个链表的第一个公共节点原创 2021-03-26 13:03:00 · 6405 阅读 · 13 评论 -
分治-芯片测试问题
芯片测试问题问题描述:有n(2≤n≤20)块芯片,有好有坏,已知好芯片比坏芯片多。每个芯片都能用来测试其他芯片。用好芯片测试其他芯片时,能正确给出被测试芯片是好还是坏。而用坏芯片测试其他芯片时,会随机给出好或是坏的测试结果(即此结果与被测试芯片实际的好坏无关)。给出所有芯片的测试结果,问哪些芯片是好芯片。输入格式:输入数据第一行为一个整数n,表示芯片个数。第二行到第n+1行为n*n的一张表,每行n个数据。表中的每个数据为0或1,在这n行中的第i行第j列(1≤i, j≤n)的数据表示用第i块芯片测试第j原创 2020-10-13 15:15:21 · 5791 阅读 · 3 评论 -
图论-单源最短路径(Dijskal算法)
不允许你还不会最短路径,详细图解,一定看得懂的!HDU-2544 最短路HDU-2680 Choose the best routePOJ-1062 昂贵的聘礼POJ-1511 Invitation CardsDijkstra算法是图论中用来求单源最短路径的经典算法,复杂度可以优化到O(mlog(n))。从整体上看就是从一个起点,扩散到整个图的过程。原创 2020-10-11 10:41:38 · 7966 阅读 · 12 评论 -
图论-多源最短路径(Floyd算法)
你肯定听过弗洛伊德算法吧,快来看看你是否真的会,没听过就更要点进来了~~POJ-3259(负圈)HDU-1385(打印路径)HDU-1599(最小环)HDU-1704(传递闭包)HDU-3631(变形)原创 2020-10-09 22:23:53 · 5914 阅读 · 4 评论 -
公平组合游戏-巴什游戏、尼姆游戏和SG函数
HDU-1846HDU-1850HDU-1907HDU-1848HDU-2999HDU-1524公平组合游戏:巴什游戏、尼姆游戏和SG函数,来玩游戏啊~~原创 2020-10-08 16:03:49 · 8376 阅读 · 7 评论 -
字符串-AC自动机(详细图解)
HDU-2222Keywords SearchHDU-2896病毒侵袭HDU-3065病毒侵袭持续中POJ-2778DNA SequenceHDU-2296RingAC自动机模板AC自动机(Aho-Corasick automaton)是KMP的升级版。即KMP是单模匹配算法,处理一个文本串中查找一个模式串的问题;而AC自动机能在一个文本串中同时查找多个不同的模式串,是多模匹配算法。原创 2020-09-28 22:49:54 · 8538 阅读 · 20 评论 -
字符串-KMP
HDU-1686OulipoHDU-2087剪花布条POJ-2752Seek the Name, Seek the FamePOJ-2406Power StringsKMP模板KMP是单模式匹配算法,即在一个长度为nn的文本串S中查找一个长度mm的模式串P。它的复杂度是O(n+m)O(n+m),差不多是此类算法能达到的最优复杂度。它是如何做到的?简单说,它通过分析P的特征对P进行预处理,从而在与S匹配的时候能够跳过一些字符串,达到快速匹配的目的。原创 2020-09-27 19:50:48 · 8028 阅读 · 15 评论 -
字符串-字典树
HDU-1251统计难题POJ-3603Phone ListAcWing-143最大异或对HDU-5536Chip Factory字典树,顾名思义是以树结构来模拟字典。回想我们查字典的过程,比如查找"man",先翻到字典m部分,再翻第二个字母a和第三个字母n,一共查找3次。查找次数最多是等于个单词的长度。插入查找单词的时间复杂度时O(m)O(m),此外有公共前缀的单词只需存一次公共前缀,节省了空间。原创 2020-09-19 22:07:41 · 6571 阅读 · 12 评论 -
组合数学-抽屉原理
HDU-1205POJ-2356抽屉原理又称鸽巢原理:把n+1n+1个物品放进nn个盒子里,那么至少有一个盒子包含两个及以上的物品。原创 2020-08-17 17:39:36 · 5365 阅读 · 0 评论 -
数论-素数
HDU-1262HDU-3792判断素数枚举[2,\sqrt{x}]用试除法判断素数。bool prime(int x) { if (x <= 1)return false; for (int i = 2; i <= sqrt(x); i++) if (x % i == 0)return false; return true;}筛法求素数依次筛掉2,3,5...的倍数,然后剩下的数就是素数,比如求区间内素数个数。vis[]表示是否被筛掉,pri原创 2020-08-15 17:33:12 · 4765 阅读 · 0 评论 -
数论-同余与逆元
HDU-5976同余两个整数a和b及模m,如果a%m=b%m,称a和b对m同余。同余也可以理解为a−b是m的倍数:m∣(a−b),例如6∣(23−11),23和11对模6同余。同余符号计为a≡b(mod m)。一元线性同余方程ax≡b(mod m),求解x的值。可以理解为ax−b是m的倍数,设倍数为y,则ax−my=b,那么就可以用扩展欧几里得求解x,可是当 不能用扩展欧几里得求解,这时需要结合下面的逆元。逆元给出a和m,求解ax≡1(mod m),原创 2020-08-09 21:35:02 · 5150 阅读 · 0 评论 -
动态规划-数位DP
HDU-2089HDU-3555数位DP是指对数字的「位」进行的与计数相关的DP,例如求数位之和,特定数字问题等。往往给定的区间很大很大,暴力会超时,复杂度要O(long(n))O(long(n))才能过。一般解题思路是用DP对「数位」进行操作,记录已算过的区间状态,用于后面快速筛选。原创 2020-08-08 23:56:55 · 4741 阅读 · 0 评论 -
任意进制转换(2进制、8进制、16进制等)
今天网络赛有道题涉及进制转换,最后时间不够了,气死我了。还是对进制转换太生疏了,所以决定对进制转换总结一下。原创 2020-08-05 21:07:43 · 7391 阅读 · 2 评论 -
数论-快速幂、矩阵快速幂、慢速乘
HDU-2817HDU-3117XUJC-1395快速幂首先幂运算a^n,就是n个a相乘,我们可以直接调用库函数pow(a,n)来计算,时间复杂度是O(n)。不过直接调用往往会超时,还会数据溢出,而快速幂的复杂度是O(log(n)),同时对中间结果进行取模,不会溢出。快速幂的原理用了位运算。比如把a^11分解成a^8、a^2、a^1的乘积,那么如何求a^8、a^2、a^1?其实不需要分别计算,因为都是2的倍数,逐级递推就可以了。那么怎么分解成11=8+2+1?其实用二进制就一目了然了。原创 2020-08-04 19:05:25 · 5442 阅读 · 0 评论 -
数论-GCD、LCM、扩展欧几里得
HDU-5523HDU-1576扩展欧几里得问题引入:ax+by=nax+by=n什么时候有整数解?有解的充要条件是gcd(a,b)gcd(a,b)可以整除nn,当方程符合ax+by=gcd(a,b)ax+by=gcd(a,b)时,可以用扩展欧几里得算法求一个整数解(x_0,y_0),程序如下:原创 2020-08-03 23:57:16 · 5040 阅读 · 0 评论 -
动态规划-树形DP
HDU-1520HDU-2196树形DP,顾名思义是在「树」这种数据结构上进行的DP,往往给定一棵树,通过指定操作求最小代价或最大收益等。一般方向主要分①从子节点向根节点传递信息,②根节点向子节点传递树操作一般利用递归和搜索,如树的遍历等,用dfs编程会比较简单,但往往状态转移方程不好设计,常常比较难(主要是我太菜了 ),令人头秃。做题步骤一般是:建树、树的遍历、DP。原创 2020-08-01 23:54:13 · 5475 阅读 · 0 评论 -
动态规划-区间DP
区间DP主要是先在小区间进行DP得到最优解,然后再利用小区间的最优解合并求大区间的最优解。一般至少需要两层循环枚举所有子区间,复杂度至少是O(n^2)HRBUST - 1818POJ - 3280原创 2020-07-31 21:32:53 · 5342 阅读 · 0 评论 -
动态规划-LCS、LIS
LCS(Longest Common Subsequence)最长公共子序列。给定两个序列a和b,当另一序列c即是a的子序列又是b的子序列时,称c时a和b的公共子序列,最长公共子序列时所有子序列中长度最长的。LIS(Longset Increasing Subsequence)最长递增子序列。给定一长度为n的数组,找出一个最长的单调递增子序列。原创 2020-07-28 22:50:12 · 5432 阅读 · 2 评论 -
动态规划-背包问题(01背包、完全背包、多重背包)
背包问题:有多个重量不同、价值不同的物品,以及一个容量有限的背包,选择一些物品装入背包,求最大总价值。背包问题无法用贪心求最优解,是典型的动态规划问题。背包问题还可以分成3种:① 0-1背包、② 完全背包、③ 多重背包。原创 2020-07-27 12:46:56 · 8435 阅读 · 8 评论 -
归并排序详解 -HDU4911 Inversion(逆序对)
什么是归并排序?归并排序是复杂度为O(nlog(n))的排序算法,运用了分治法的思想,虽然一般直接使用sort(),不需要自己写排序,但归并排序的典型应用如 逆序对问题。原创 2020-05-13 12:26:29 · 5421 阅读 · 1 评论 -
贪心-HDU3348 coins(钱币问题)
“Yakexi, this is the best age!” Dong MW works hard and get high pay, he has many 1 Jiao and 5 Jiao banknotes(纸币), some day he went to a bank and changes part of his money into 1 Yuan, 5 Yuan, 10 Yuan.(1 Yuan = 10 Jiao)“Thanks to the best age, I can buy ma原创 2020-05-10 00:52:16 · 4915 阅读 · 2 评论 -
贪心-HDU1789 Doing Homework again(活动安排问题)
Ignatius has just come back school from the 30th ACM/ICPC. Now he has a lot of homework to do. Every teacher gives him a deadline of handing in the homework. If Ignatius hands in the homework after the deadline, the teacher will reduce his score of the fin原创 2020-05-09 23:39:13 · 4609 阅读 · 0 评论 -
树状数组-HDU3015 Disharmony Trees
什么是树状数组?简单来说,就是暴力遍历数组来解决区间问题等,不过遍历的路径使用了位运算来进行压缩,复杂度是O(log2(n))这样就不会超时了(为所欲为?)。lowbit()操作其核心是神奇的lowbit操作,lowbit(x)=x&(-x),它的功能是找到x的二进制数的最后一个1,原理是利用负数的补码表示,补码是原码取反加一。例如x=6=00000110(2),-x=x补=11111010(2),那么lowbit(x)=x&(-x)=10(2)=2。从lowbit()引出数组a[],a[x]的值是原创 2020-05-04 00:00:36 · 4739 阅读 · 0 评论 -
二维树状数组-POJ 2155 Matrix
什么是树状数组?简单来说,就是暴力遍历数组来解决区间问题等,不过遍历的路径使用了位运算来进行压缩,复杂度是O(log2(n))这样就不会超时了(为所欲为?)。lowbit()操作其核心是神奇的lowbit操作,lowbit(x)=x&(-x),它的功能是找到x的二进制数的最后一个1,原理是利用负数的补码表示,补码是原码取反加一。例如x=6=00000110(2),-x=x补=11111010(2),那么lowbit(x)=x&(-x)=10(2)=2。从lowbit()引出数组a[],a[x]的值原创 2020-04-18 12:10:05 · 4791 阅读 · 2 评论 -
拓扑排序-HDU2647 Reward
什么是拓扑排序?简单来说,在做一件事之前必须先做另一(几)件事都可抽象为图论中的拓扑排序,比如课程学习的先后,安排客人座位等。一个图能拓扑排序的充要条件是它是有向无环图。将问题转为图,比如A指向B代表完成B前要先完成A,那么用数组记录入度,从入度为0的开始搜索(bfs/dfs)和维护数组,即可得到拓扑排序。原创 2020-04-17 00:16:36 · 4698 阅读 · 0 评论 -
差分标记-HDU1556 Color the ball
什么是差分标记?差分标记,是一种和前缀和相对的离线算法。所谓差分就是将数组a每一项与前一项做差,记作差分数组b,易得对数组b做一遍前缀和就得到了原来的a数组。因为是离线算法所以修改操作一定要在查询操作之前,它可以维护多次对序列的一个区间加减上一个数,最后询问某一位的数。原创 2020-04-02 23:37:00 · 4808 阅读 · 0 评论 -
带权/种类并查集-POJ 1182食物链
带权并查集带权并查集是结点存有权值信息的并查集。权值使关系可以量化,也就是说,权值代表着当前节点与父节点的某种关系,通过两者关系,也可以将同一棵树下两个节点的关系表示出来。而一般并查集只能判断属于某个集合。种类并查集一般并查集可以判断一种关系,即属于这种关系或不属于这种关系,比如朋友的朋友是朋友。但比如敌人的敌人是朋友这种涉及两种以上的关系就会用到种类并查集,其实就是用多个并查集来模拟种类。原创 2020-03-31 19:42:46 · 4838 阅读 · 0 评论 -
迭代加深搜索-POJ 3134 Power Calculus
什么是迭代加深搜索?迭代加深搜索(Iterative Deepening DFS,IDDFS)是一种结合了DFS和BFS思想的搜索方法。当搜索树很深且很宽的时候,用DFS会陷入递归无法返回,用BFS队列空间会爆炸,那么可以试试IDDFS,简单来说,就是每次限制搜索深度的DFS。比如DFS搜索k层,若没有找到可行解则立即返回,再DFS搜索k+1层,直到找到可行解为止,在层数上采用BFS思想来逐步扩大DFS的搜索深度。IDA*估价函数对迭代加深搜索的优化,即乐观估计剪枝。当找到解需要的至少层数+当前层数原创 2020-03-31 00:21:29 · 4807 阅读 · 0 评论 -
双向广搜-HDU1401 Solitaire
什么是双向广搜?如果把bfs想象成在平静的池塘丢一颗石头,激起的波浪一层层扩散到整个空间直到到达目标,就得到起点到终点的最优路径。那么双向广搜就是在起点和终点同时丢石头,两个波浪将在中间某个位置相遇,即得到最优路径。原创 2020-03-28 22:33:05 · 5998 阅读 · 1 评论 -
最小生成树-Magicpig密室出逃(Kruskal+并查集)
在金字塔中有一个叫Room-of-No-Return 的大房间,非常不幸的是Magicpig现在被困在这个房间里。房间的地板上有一些钩子。在房间的墙上有一些古老的埃及文字:“如果你想逃离这里,你必须用绳索连接所有这些钩子,然后一个秘密的门将打开,你将获得自由。如果你不能这样做,你将永远被困在这里”。幸运的是Magicpig有一条长度为L的绳索,他可以把它切成段,每段可以连接两个钩子,如果他能用这段绳子连接所有钩子,并且连接的绳子不能出现环路,就可以成功逃脱!Kinfkong想知道他是否可以逃跑。原创 2020-03-25 23:11:08 · 5160 阅读 · 1 评论