
一本书学完,拿到普一提二
文章平均质量分 87
还在为信息竞赛发愁?《一本书学完,拿到普一提二》助你突破困境!本书紧扣信息竞赛要点,从基础概念到算法技巧,由浅入深讲解。无论你是刚入门的小白,还是有一定基础的选手,都能从中汲取知识。学完这本书,助力你在信息竞赛中达到普及组一等奖、提高组二等奖的水平,开启信息学的新征程!
无双worker
穿川晓月皎明雾,烟起云涌润一花。
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
那些正常的动态规划
在说线性dp之前,我们先来聊一聊动态规划是啥?动态规划是普及组内容中最难的一个部分,也是每年几乎必考的内容。它对思维的要求极高,它和图论、数据结构不同的地方在于它没有一个标准的数学表达式和明确清晰的解题方法。动态规划是对求解最优解的一种途径,而不是一种特殊的算法。由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的阶梯方法,而不存在一种万能的动态规划算法。为了方便学习,我们把若干具有代表性的动态规划问题归纳总结成不同的几类,并建立对应的数学模型。动态规划一般用原创 2025-03-24 18:11:59 · 1214 阅读 · 0 评论 -
浅说差分约束
当我们的题目中遇到一些存在不等关系的式子的时候,我们其实可以把它转换成图上问题来解决。为什么呢?我们可以观察一下这两个式子:aj≤ai+wa_j\le a_i+waj≤ai+wdisj≤disi+wi,jdis_j\le dis_i+w_{i,j}disj≤disi+wi,j第一个是我们的要求的式子,第二个是我们在求最短路的时候的式子,是不是可以发现这两个是惊人的相似?那么我们是不是就可以类比一下?我们把 aia_iai 类比成 disidis_idisi ,aja_jaj 类比成 disj原创 2025-03-17 17:22:13 · 794 阅读 · 0 评论 -
浅说最短路
我们在信息学奥赛中,时常会遇到让我们求图上最短路的问题,之前我们可以敲dfs或bfs,但是这两个一个时间复杂度太大了,一个有限制条件,所以说我们还不如重新研究一个算法,所以这就有了最短路算法。但是这里有个点值得注意,最短路算法不仅仅可以用于解决最短路,还可以用于解决一些不等式(组)求解的问题,也就是我们经常说的差分约束。友情提示:在学习这篇之前,请先学习图论基础章如果说,我们只想求一个点到另一个点或者说一个点到其他所有点的最短路的话,这也就是在求单源最短路,一般情况下,单源最短路会用两种算法解决,一个是D原创 2025-03-14 15:34:18 · 454 阅读 · 0 评论 -
浅说树形dp
因为树的形式非常适合递归,他所带来的访问顺序也是非常符合拓扑排序的,故而在处理子树类问题时,dp可以很好的利用相邻层级之间的关系和逻辑,非常符合dp的“口味”,所以我们才有了这个树形dp。树形dp和线性dp没有什么本质上的区别,只不过一个是在树上,一个是在线上,唯一的一个不同点就是树形dp可以大致的定形,而线性dp却不可以。原创 2025-02-15 22:33:25 · 1013 阅读 · 1 评论 -
浅说树上差分——边差分
其实这种差分的思路和点差分的思路差不多,只不过因为是边,所以我们不能直接操作,因此我们要把这个边放到这条边所连接的两个点中的更深一层的点。deepxdeepy→pympxy我们还是一步一步的推,相信在有上节课中教你的推导方式,这个公式也是呼之欲出的,所以我就不做示范了,下来你可以自己试试。这个的话,总结一下就是。至于求得最后的答案,也是和点差分是一样的,所以就不做过多的赘述了。原创 2025-01-23 09:30:40 · 1044 阅读 · 0 评论 -
浅说树上差分——点差分
我们前面也学过差分,现在的话我们就把他放到树上来做。因为这是树,所以会有点和边之分,所以树上差分也会分为和。原创 2025-01-22 17:32:37 · 681 阅读 · 0 评论 -
浅说树上倍增(下)
书接上文。原创 2025-01-20 15:55:22 · 821 阅读 · 0 评论 -
浅说树上倍增(上)
之前我们学过线性倍增,所以我们现在把这种思想放到树上来试试。原创 2025-01-20 15:40:35 · 813 阅读 · 0 评论 -
细说简单简单莫队
在信竞得路上,我们时常遇到一些题目让我们求解一段区间里的颜色个数有多少啊,这个区间内的最大值是多少啊?诸如此类的问题常常让我们这些菜鸡束手无策,所以莫队算法横空出世!莫队算法是由莫涛提出的算法。在莫涛提出莫队算法之前,莫队算法已经在 Codeforces 的高手圈里小范围流传,但是莫涛是第一个对莫队算法进行详细归纳总结的人。莫涛提出莫队算法时,只分析了普通莫队算法,但是经过 OIer 和 ACMer 的集体智慧改造,莫队有了多种扩展版本,想什么待修莫队之类的。原创 2024-11-26 16:01:18 · 471 阅读 · 0 评论 -
分块——最为优雅的暴力
在信息学竞赛中,常常会遇到一些区间修改或区间查询的题目,如果直接敲暴力的话,时间复杂度是Onm可能会超时,如果写树状数组或线段树的话,又有一点复杂,不易理解,那么这时候就要请出我们今天的主角——原创 2024-11-09 18:36:54 · 1663 阅读 · 0 评论 -
线性dp(下)
最近博主身体不适,更新较慢,请大家体谅体谅。原创 2024-11-01 18:40:12 · 970 阅读 · 0 评论 -
线性dp(上)
在说线性dp之前,我们先来聊一聊动态规划是啥?原创 2024-11-01 18:38:42 · 735 阅读 · 0 评论 -
浅说倍增算法——线性倍增
倍增,倍增,顾名思义,就是以一个数成倍的增长,这个数通常是2。当然也会有在不同的时候会以其他的数进行翻倍,比如3,8,16等等,但是都不常见。我们现在就先来讲讲倍增中的线性倍增。原创 2024-10-22 15:27:06 · 1810 阅读 · 0 评论 -
浅说差分算法(下)
二维差分是指对于一个n*m的矩阵a,要求支持操作pro(x1,y1,x2,y2,a),表示对于以(x1,y1)为左上角,(x2,y2)为右下角的矩形区域,每个元素都加上常数a。求修改后的矩阵a。原创 2024-10-21 17:20:49 · 364 阅读 · 0 评论 -
浅说差分算法(上)
今天我们来讲讲对于数列修改的一个小技巧,原创 2024-09-25 18:23:49 · 846 阅读 · 1 评论 -
浅说树的基本性质(下)
树的重心也叫树的质心。找到一个点,其所有的子树中最大的子树节点数最少,那么这个点就是这棵树的重心,删去重心后,生成的多棵树尽可能平衡。我们求解树的重心也非常简单,我们还是以任意点的起点,找到一这个点为根的每个点的子树的数量,然后从中找一个最小值就行了,当然我们这里最好去维护一个每个节点与之有关联的节点的节点数,因为有可能是无根树。原创 2024-08-29 14:49:11 · 1208 阅读 · 0 评论 -
浅说树的基本性质(中)
在学会如何写代码之前,我们要先了解一下树的直径的性质。让我们来证明一下上面的两个结论。命题1:直径的两端点一定是两个叶子节点我们这里采用反证法,如果直径的两个端点不是叶子结点,那么必然这个节点一定会有孩子节点,那么这样的路程又可以增加一节,所以原直径并不是这棵树的直径,矛盾。所以直径的两端点一定是叶子结点命题2:距离任意点最远的点一定是直径的一个端点我们这里同样采用反证法,如果距离任意点最远的点不是直径的一个端点,那么这里就有两种情况:我们设当前直径为xy,现有任意点O和另一个点M。原创 2024-08-23 20:46:50 · 1474 阅读 · 0 评论 -
浅说树及其基本性质(上)
在了解树的基本性质之前,我们要先知道什么是树。首先我们知道树分为和,有根树指的是有一个固定的根,无根树指的是没有固定的根,任何一个节点都可以为树,我们一般情况下,只分析有根树树是nn1个结点的有限集。当时这棵树没有节点时,称为空树。在任意一棵树非空树中应满足:(1) 有且仅有一个特定的称为根root的结点;(2) 当n1时,其余结点可分为个互不相交的有限集,其中每一个集合本身又是一颗树,并且称为根的子树(SubTree)原创 2024-08-23 20:12:21 · 1217 阅读 · 0 评论 -
浅说区间dp(下)
好了,到目前为止,普及组所要用到的动态规划问题我们基本上是讲完了,不知道大家有没有收获呢?如果有问题,欢迎到评论区留言,或者私信博主,如果喜欢博主的博客的话,请点一个赞,蟹蟹~~原创 2024-07-16 17:35:35 · 1335 阅读 · 0 评论 -
浅说区间dp(上)
但是和前面合并型区间dp的思考方式有一点区别,我们并不是考虑最后一次拆分,然后前面有k个乘号,那么后面区间就有j-k-1个乘号,然后两这相乘的最大值,如果是这样,那么数组就需要dp[i][j][k]来表示,虽然这样也可以做,但是效率上会低一些,而且消耗的空间也比较大。该题和前面做过的一道合并果子的题类似,但是不一样的地方在于每次只能合并相邻两堆,如果我们贪心的每次选择相邻的最小的两堆合并,那么答案明显是错误的,因为前面合并顺序的不同会影响后面每堆的数量,所以我们要考虑动态规划。回文词是一种对称的字符串。原创 2024-07-15 17:39:16 · 1479 阅读 · 0 评论 -
浅说背包问题(下)
背包问题是线性DP的一个衍生,同时也是比较复杂的动态规划问题的一个简单雏形。动态规划是信息学竞赛的一个重难点,要想学好动态规划,先打好基础是非常有必要的。同样的,背包问题远不止这九类,还有很多类型的比较复杂的背包问题,这里先不做累述了。如果遇到比较复杂的背包问题,或者没有讲解过的背包问题,先看看能否转换前面我们学习过的简单背包问题来处理。一定要仔细分析问题,想出解决该类问题的状态状态转移方程(当前状态怎么由前一状态到达)码了8000多个字,又破记录了。原创 2024-07-14 18:41:35 · 757 阅读 · 0 评论 -
浅说背包问题(中)
有N种物品和一个容量为V的背包。每种物品都有一个体积和价值,以及该物品有多少件。求解怎么装可使这些物品的体积总和不超过背包容量,且价值总和最大。问最大价值是多少13这种背包问题和前面的背包问题不同的地方在于,一种物品可以有很多件,并不是只可以取一件。我们可以把它转换成01背包来求解。每种物品有m[i]件,可以理解为有m[i]种该物品,每种物品只有一件。这就转换成了01背包。但是我们可以注意到这里会去枚举一个数量k,那么这个地方就有问题了,不难发现,k有两个位置可以放如图所示。原创 2024-07-13 20:56:45 · 1157 阅读 · 0 评论 -
浅说背包问题(上)
背包问题是线性DP的一个拓展,它的模型一般为:有一个体积为V的背包,有n种物品,每种物品的数量有限或者无限,每个物体有它的属性(体积、质量等),问在不超过背包体积的情况下如何选择物品才能让物品的属性之和最大。首先,很容易想到贪心是错误的,无论是从大到小贪,还是从小到大贪心的往背包里放物品,都可以找到反例。那么我们在这个地方就要考虑动态规划了。原创 2024-07-11 17:44:31 · 870 阅读 · 0 评论 -
浅说平面dp(下)
wjq刚刚从床上起来,喜欢性感的她要去她寝室的不同位置去拿衣服,可是她的舍友把她的衣服丢的到处都是,黑丝,白丝,制服等衣服散在不同的位置上,wjq只好挨个去拿。wjc由于没有穿鞋,而且用她的粉粉嫩嫩的脚走起来非常的不舒服,然而鞋又在寝室门口,所以她想走一条最短路到教室的门口,但是性感度太少了她自己又不舒服,所以她决定走一条性感程度最高的最短路线(即保证路径最短的前提下性感程度最高),你能帮帮她吗?给定一个长为 n 的序列,任意选择其中连续的 x(0≤𝑥≤n)项所确定的一段更短的连续序列叫作一个子段。原创 2024-07-10 15:37:58 · 1114 阅读 · 0 评论 -
详解平面DP(上)
其实平面DP和正常的dp没有什么本质上的区别,只不过是在二维的面上进行DP,而且,客观的说,其实和递推没有什么区别,不要把他想的太难了。原创 2024-07-09 18:38:00 · 808 阅读 · 0 评论 -
浅说线性DP(下)
动态规划入门详解原创 2024-06-07 18:47:59 · 1013 阅读 · 0 评论 -
浅说线性DP(上)
在说线性dp之前,我们先来聊一聊动态规划是啥?原创 2024-05-28 14:32:17 · 1067 阅读 · 0 评论 -
浅说二分答案
前面我们讲的主要都是二分查找,二分查找在考试中一般都不会作为独立算法而存在,一般都是一道题中部分算法,它主要是基于单调性的减少枚举次数。而枚举除了枚举操作还可以枚举答案,枚举答案同样可以用二分来减少枚举次数,这就是比赛中常考的二分答案。很多时候当答案不是很容易直接计算的时候,我们可以考虑枚举答案,但是答案范围特别大,但是又具有单调性的时候,直接一个一个枚举答案效率很低,我们可以考虑二分枚举,如果答案有10亿种,那么二分枚举只需要30次左右就可以枚举完,大大提高了枚举效率。原创 2024-05-23 18:20:52 · 731 阅读 · 0 评论 -
浅说二分查找
在一次商场宣传活动中,你被主持人邀请上台完一个“我想你猜”的游戏。游戏规则如下:主持人先想好一个数字,这个数字在1—1000之间,然后把数字写在纸条上,然后主持人叫你来猜这个数字是多少,每当你猜一个数字之后,如果正确那么就获胜,如果错误,主持人会告诉你你的答案大了还是小了,然后让你继续猜,最后根据你猜的次数来给你分配奖品。现请你设计一种策略保证每次猜数的次数尽可能少。玩这个游戏,除非你会读心术或者内定获胜者,否则你只能凭空猜测,没有任何规律可言。但是我们就只能盲猜了吗?原创 2024-05-16 18:26:33 · 796 阅读 · 0 评论 -
浅说广度优先搜索
在搜索中,最重要的就是求解最短路,我们前面学习的求解最短路的办法无论怎么剪枝就会有重复路径,因为我们的方法都是尝试去走这条路,如果不行再返回,既然是尝试,那么肯定有错误路径。我们有没有办法直接让我们走的每一步路都一定是当前的最短路呢?答案是有的,我们可以按层来搜索,从起点开始,搜索出所有第一层能到达的点,那么从起点到这些点的最短路就知道了,再从这些第一层能到达的所有点依次出发,那么能到达的所有点就是第二层的点,依次类推,那么对于任意一个点,第一次访问到的该点就是起点到该点的最短路径。原创 2024-05-09 18:02:49 · 964 阅读 · 0 评论 -
优先队列讲解
给定一个数列,初始为空,请支持下面三种操作:1.给定一个整数 x,请将 x 加入到数列中。2.输出数列中最小的数,如果数列中没有数,输出0。3.删除数列中最小的数(如果有多个数最小,只删除 1 个,如果数列中没有数,则忽略该操作)。该题需要不停的找最小值,并且删除最小值,如果按照暴力做法,每次删除或者插入一个数,时间复杂度太大了,所以我们需要找到一种能够一直维护当前数组最大/最小值的数据结构,在C++中,就存在这样一种STL—优先队列。原创 2024-05-04 16:01:10 · 514 阅读 · 0 评论 -
队列——用数组来表示
为什么要用数组来模拟队列?因为数组机动性高,可用性高,灵活性也高。原创 2024-04-28 15:18:54 · 239 阅读 · 0 评论 -
双端队列——用数组来表示(下)——高级做法
其实我们可以从末尾来写。就是说我们可以以n为起点,来分开写.这个就是一个显然的空间换时间,这种写法比上一种写快了至少3倍!1:删除当前数组最后一个元素,如果数组中没有元素则忽略;3:删除当前数组中第一个元素,如果数组中没有元素则忽略;2 x:在当前数组最后一个数后面插入一个数x;4 x:在当前数组第一个元素前面插入一个数x;还是我说的,从末尾开写!我们可以通过一个题来讲述这件事。原创 2024-04-27 21:21:34 · 221 阅读 · 0 评论 -
双端队列——用数组来表示(上)——朴素做法
为什么这么说呢?因为STL是死的,是已经固定好了的,那么再一些双端队列的“变种题”中,可能就会失效,但是用数组来模拟,可以随时随地的调换,非常的灵活。同时用数组来模拟的话,常数要小很多,也算是卡了个小常了吧。原创 2024-04-27 21:14:45 · 217 阅读 · 0 评论 -
浅说深度优先搜索(下)——深度优先算法
绕了两个大圈,终于是到了正题了,今天我们就来学一学它!全是干货!原创 2024-04-23 15:54:55 · 1641 阅读 · 1 评论 -
浅说深度优先搜索(中)——回溯
相信在你们不懈的努力之下,基本的递归一定可以写出来了,那么我们现在就来看看递归的升级版——回溯怎么写吧!原创 2024-04-22 18:25:05 · 1439 阅读 · 0 评论 -
浅说深度优先搜索(上)——递归
好久没有讲算法了,今天我们就来谈谈“初学者”的第二个坑,深度优先搜索,其实也就是递归。原创 2024-04-12 19:11:31 · 1417 阅读 · 0 评论