[算法进阶指南]习题题解
这里是我对于蓝书大部分难题、经典题型的总结和题解。
理解全书完成习题的读者,达到 NOIP 400~500分水平,动规、图论等传统知识的深度达到省选水平。
1. 举一反三,知识点到算法模型逐级扩展;
2. 实战积淀,提供细致的长期训练指南;
3. 切中要点,巧妙引导思维体系建
pigzhouyb
一个来自浙江的可爱的萌萌哒的肥肥胖胖的OIer
展开
-
『博弈论』格鲁吉亚和鲍勃
题目描述题解我们先来思考只有两个棋子的问题:很显然,当一个人面对两个棋子相邻的局面时,必败。我们设SG(i)SG(i)SG(i)表示两个棋子之间的距离为iii的SGSGSG函数值。SG(0)=0.SG(0)=0.SG(0)=0.SG(1)=mex(SG(0))=1.SG(1)=mex(SG(0))=1.SG(1)=mex(SG(0))=1.SG(2)=mex(SG(1),SG(...原创 2019-05-04 20:59:26 · 184 阅读 · 0 评论 -
『博弈论』魔法珠
题目描述题解这是一道博弈论SGSGSG函数的题。我们记SG(i)SG(i)SG(i)表示大小为i的石头的SGSGSG函数。边界条件是:SG(0)=0SG(0)=0SG(0)=0.为了得到每一份SGSGSG值,我们需要对每一个扩展的状态进行mexmexmex运算。对于每一个扩展的状态,若由若干个毫不相关的状态组成,则对应得mex运算值需要进行异或运算来解决。例如本提中:对于一个状态iii...原创 2019-05-04 20:44:30 · 331 阅读 · 0 评论 -
『高斯消元·博弈论·贪心』[CQOI2013]新NIM游戏
题目描述传统的Nim游戏是这样的:有一些火柴堆,每堆都有若干根火柴(不同堆的火柴数量可以不同)。两个游戏者轮流操作,每次可以选一个火柴堆拿走若干根火柴。可以只拿一根,也可以拿走整堆火柴,但不能同时从超过一堆火柴中拿。拿走最后一根火柴的游戏者胜利。本题的游戏稍微有些不同:在第一个回合中,第一个游戏者可以直接拿走若干个整堆的火柴。可以一堆都不拿,但不可以全部拿走。第二回合也一样,第二个游...原创 2019-05-04 20:17:20 · 1638 阅读 · 0 评论 -
『高斯消元』异或运算(异或线性空间)
题目描述给定你由N个整数构成的整数序列,你可以从中选取一些(甚至一个)进行异或(XOR)运算,从而得到很多不同的结果。请问,所有能得到的不同的结果中第k小的结果是多少。题解显然在组成的若干个数异或起来后一定存在重复的数;我们需要做的就是去掉那些重复的数。显然在线性空间中如果一个数能被其他数字异或起来得到,高斯消元的结果一定为000;所以我们去掉这些数即可。在此基础上,我们就可以找到若干个...原创 2019-05-04 20:02:37 · 698 阅读 · 0 评论 -
『高斯消元』装备购买(线性空间+贪心)
题目描述题解根据线性空间的原理:若一个向量如果会被其他的向量表出,那么这个数在高斯消元里全为0.那么我们只需要进行一个最单纯的高斯消元,每一次查找装备的时候基于贪心、找最小的即可。注意这道题卡精度,要使用long double。代码如下:#include <bits/stdc++.h>using namespace std;const int N = 550;i...原创 2019-05-04 19:44:20 · 132 阅读 · 0 评论 -
『高斯消元』开关问题(特殊解的判定+异或高消)
题目描述有N个相同的开关,每个开关都与某些开关有着联系,每当你打开或者关闭某个开关的时候,其他的与此开关相关联的开关也会相应地发生变化,即这些相联系的开关的状态如果原来为开就变为关,如果为关就变为开。你的目标是经过若干次开关操作后使得最后N个开关达到一个特定的状态。对于任意一个开关,最多只能进行一次开关操作。你的任务是,计算有多少种可以达到指定状态的方法。(不计开关操作的顺序)题解我们...原创 2019-05-04 19:39:02 · 301 阅读 · 0 评论 -
『高斯消元』球形空间产生器
题目描述有一个球形空间产生器能够在n维空间中产生一个坚硬的球体。现在,你被困在了这个n维球体中,你只知道球面上n+1个点的坐标,你需要以最快的速度确定这个n维球体的球心坐标,以便于摧毁这个球形空间产生器。题解题目大意:求在n维空间中n+1个点,求解一个点的坐标使得这个点到其他每一个点的距离都相等。这道题的难点在于数学推导,推到完以后就直接套高斯消元模板即可。若i∈[1,n+1]i∈[1...原创 2019-05-04 19:14:49 · 150 阅读 · 0 评论 -
『排列计数·Lucas定理』「SDOI2010」古代猪文
题目大意题目很长,这里就不说了吧。粘个链接:古代猪文题目大意就是:给定整数n,q,计算q∑d∣nCnd mod 999911659q^{\sum_{d|n} C_{n}^{d}}\ mod\ 999911659q∑d∣nCnd mod 999911659.题解这道题的nnn很大;如果暴力枚举每一个ddd,再直接求解组合数的话,由于nnn和ddd很...原创 2019-04-26 20:43:23 · 176 阅读 · 0 评论 -
『数学期望·枚举』Rinbow的信号
题目描述Freda发明了传呼机之后,rainbow进一步改进了传呼机发送信息所使用的信号。由于现在是数字、信息时代,rainbow发明的信号用N个自然数表示。为了避免两个人的对话被大坏蛋VariantF偷听,rainbow把对话分成A、B、C三部分,分别用a、b、c三个密码加密。现在Freda接到了rainbow的信息,她的首要工作就是解密。Freda了解到,这三部分的密码计算方式如下:...原创 2019-04-26 19:45:22 · 227 阅读 · 0 评论 -
『概率DP』守卫者的挑战
题目描述打开了黑魔法师Vani的大门,队员们在迷宫般的路上漫无目的地搜寻着关押applepi的监狱的所在地。突然,眼前一道亮光闪过。“我,Nizem,是黑魔法圣殿的守卫者。如果你能通过我的挑战,那么你可以带走黑魔法圣殿的地图……”瞬间,队员们被传送到了一个擂台上,最初身边有一个容量为K的包包。擂台赛一共有N项挑战,各项挑战依次进行。第i项挑战有一个属性ai,如果ai>=0,表示这次挑战成...原创 2019-04-25 21:29:30 · 207 阅读 · 0 评论 -
『数学期望·动态规划』扑克牌
DescriptionRainbow把一副扑克牌(54张)随机洗开,倒扣着放成一摞。然后Admin从上往下依次翻开每张牌,每翻开一张黑桃、红桃、梅花或者方块,就把它放到对应花色的堆里去。Rainbow想问问Admin,得到A张黑桃、B张红桃、C张梅花、D张方块需要翻开的牌的张数的期望值E是多少?特殊地,如果翻开的牌是大王或者小王,Admin将会把它作为某种花色的牌放入对应堆中,使得放入之后E...原创 2019-04-25 21:10:21 · 1364 阅读 · 0 评论 -
『拓扑排序·期望』绿豆蛙的归宿
Description给出一个有向无环的连通图,起点为1终点为N,每条边都有一个长度。绿豆蛙从起点出发,走向终点。到达每一个顶点时,如果有K条离开该点的道路,绿豆蛙可以选择任意一条道路离开该点,并且走向每条路的概率为 1/K 。现在绿豆蛙想知道,从起点走到终点的所经过的路径总长度期望是多少?题解我们知道期望是可以直接转移的,若f[x]表示当前状态,f[y]表示接下来的状态,那么一定可以转...原创 2019-04-25 20:44:24 · 211 阅读 · 0 评论 -
【习题·搜索】Power Hungry Cows(启发式搜索A*+剪枝)
题目描述FJ的奶牛想要快速计算整数P的幂 (1 <= P <=20,000),它们需要你的帮助。因为计算极大数的幂,所以它们同一时间仅能使用2个存储器,每个存储器可记录某个结果值。 第一件工作是初始化存储器内的值一个为底数x, 另一个为1。 奶牛可以相乘或相除2个存储器中的值,并把结果存在其中某个存储器内,但所有存储的结果必须是整数。 例如, 如果他们想计算x^31, 一种计算方法是...原创 2019-04-07 21:24:11 · 610 阅读 · 0 评论 -
【习题·搜索】Square Destroyer(启发式搜索IDA*)
题目描述下图左侧显示了一个用2 *(3 * 4)(= 24)火柴棍制成的完整3 * 3网格。所有火柴的长度都是一个。您可以在网格中找到许多不同大小的正方形。正方形的大小是其边长。在左图所示的网格中,有9个尺寸为1的正方形,4个尺寸为2的正方形和1个正方形的尺寸为3的正方形。整个网格的每个火柴杆都标有唯一编号,该编号从左到右,从上到下分配,如左图所示。如果你从整个网格中取出一些火柴棍,那么网格中...原创 2019-04-04 13:12:15 · 316 阅读 · 0 评论 -
【例题·搜索】The Rotation Game(启发式搜索IDA*)
题目描述一个井字形棋盘,上面有24个格子(如下图)。这些格子上面有1,2,3三种数字, 且每种数字有 8 格。一开始,这些格子上的数字是随机分布的。你的任务是移动这些格 子使得中间 8 个格子的数字相同。有 8 种移动方式,分别标记为 A 到 H,可以理解为 拉动 4 条链,如图的变换为“AC”。问至少需要多少次拉动,才能从初始状态到达目标 状态?(保证数据有解)题解算法是IDA∗I...原创 2019-04-04 12:58:02 · 596 阅读 · 0 评论 -
【例题·搜索】八数码问题(A*)
题目描述在3×3的棋盘上,摆有八个棋子,每个棋子上标有1至8的某一数字。棋盘中留有一个空格,空格用0来表示。空格周围的棋子可以移到空格中。要求解的问题是:给出一种初始布局(初始状态)和目标布局(为了使题目简单,设目标状态为123804765),找到一种最少步骤的移动方法,实现从初始布局到目标布局的转变。题解这道题可以用A∗A*A∗算法解决。每一个状态由空格朝四个方向进行扩展,使用优先队列B...原创 2019-04-02 21:41:01 · 1494 阅读 · 0 评论 -
【习题·搜索】字串变换(双向广搜)
题目描述描述已知有两个字串 AA,BB 及一组字串变换的规则(至多6个规则):·A1 -> B1·A2 -> B2规则的含义为:在 AA中的子串 A1A1 可以变换为 B1B1、A2A2 可以变换为 B2B2 …。例如:A=’abcd’ B=’xyz’变换规则为:‘abc’->‘xu’ ‘ud’->‘y’ ‘y’->‘yz’则此时,AA 可以经过一系...原创 2019-04-02 21:30:16 · 401 阅读 · 0 评论 -
【习题·搜索】Bookcase(IDA*)
题目描述有N(1 <=N <= 15)本书,每本与每本的高度都不一样。现在可以按照以下的办法整理书:抽出一摞书,再保持原来的顺序插进一个位置。这样的话我们称之为“一次操作”。现在你需要求出至少需要经过几次操作才能让书变成按高度升序的状态。如果需要5次或者多于5次,只需要输出“5 or more”。题解如果暴力考虑搜索:我们将LLL-RRR的书放到KKK后面,此时一定满足K&...原创 2019-04-02 18:13:53 · 143 阅读 · 0 评论 -
【习题·搜索】[SCOI2005]骑士精神(IDA*)
题目描述在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位。在任何时候一个骑士都能按照骑 士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2,纵坐标相差为1的格子)移动到空 位上。 给定一个初始的棋盘,怎样才能经过移动变成如下,目标棋盘: 为了体现出骑士精神,他们必须以最少的步 数完成任务。Solution这题在每一次的跳跃中,必然与空格有关,所...原创 2019-03-30 16:03:34 · 192 阅读 · 0 评论 -
【习题·搜索】送礼物(双向DFS)
题目描述作为惩罚,GY被遣送去帮助某神牛给女生送礼物(GY:貌似是个好差事)但是在GY看到礼物之后,他就不这么认为了。某神牛有N个礼物,且异常沉重,但是GY的力气也异常的大(-_-b),他一次可以搬动重量和在w(w<=2^31-1)以下的任意多个物品。GY希望一次搬掉尽量重的一些物品,请你告诉他在他的力气范围内一次性能搬动的最大重量是多少。题目大意体积很大,个数很少的01背包。做法...原创 2019-03-27 12:14:54 · 414 阅读 · 0 评论 -
【例题·搜索】Addition Chains(迭代加深搜索)
来源:POJ2248题目大意规定第一个数为1,第二个数是2,你需要找到长度为m的序列使得这一个序列中每一个数都有前面的两个相同或不同的数拼凑而成,输出这一个m最小的任意序列方案(SPJ)。做法首先需要说一下什么叫做迭代加深搜索。在某一颗搜索树上,如果答案在这一棵树的浅层那么我们如果在深度较大的子树上搜索就会浪费很多的时间,因此我们需要需要控制搜索的深度,不断的从浅层向深层进行扩展。具体...原创 2019-03-26 21:02:07 · 404 阅读 · 0 评论 -
【习题·搜索】[NOIP2009]靶型数独(搜索+剪枝+位运算优化)
题目小城和小华都是热爱数学的好学生,最近,他们不约而同地迷上了数独游戏,好胜的他们想用数独来一比高低。但普通的数独对他们来说都过于简单了,于是他们向 Z 博士请教,Z 博士拿出了他最近发明的“靶形数独”,作为这两个孩子比试的题目。靶形数独的方格同普通数独一样,在 99 格宽×99 格高的大九宫格中有9 9 个 33 格宽×33 格高的小九宫格(用粗黑色线隔开的)。在这个大九宫格中,有一些数字是...原创 2019-03-26 13:33:23 · 233 阅读 · 0 评论 -
【习题·字符串】匹配统计(KMP计数)
题目描述阿轩在纸上写了两个字符串,分别记为A和B。利用在数据结构与算法课上学到的知识,他很容易地求出了“字符串A从任意位置开始的后缀子串”与“字符串B”匹配的长度。不过阿轩是一个勤学好问的同学,他向你提出了Q个问题:在每个问题中,他给定你一个整数x,请你告诉他有多少个位置,满足“字符串A从该位置开始的后缀子串”与B匹配的长度恰好为x。例如:A=aabcde,B=ab,则A有aabcde、ab...原创 2019-03-24 21:11:15 · 790 阅读 · 1 评论 -
【习题·哈希】Matrix(二维奇葩Hash)
题目描述给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过。所谓01矩阵,就是矩阵中所有元素不是0就是1。题解这道题是一个奇葩的二维哈希,做法也非常的玄学,用到了字符串哈希的思想还利用了大质数取模的方法。具体的实现是这样的:把每一行都看成某一个进制的数,一般使用131进制数,则可以f[i]=1...if[i]=1...if[i]=1...i...原创 2019-03-24 20:46:45 · 418 阅读 · 2 评论 -
【习题·数据结构】[NOI2015]荷马史诗(多叉哈夫曼树)
Problem追逐影子的人,自己就是影子。 ——荷马Allison 最近迷上了文学。她喜欢在一个慵懒的午后,细细地品上一杯卡布奇诺,静静地阅读她爱不释手的《荷马史诗》。但是由《奥德赛》和《伊利亚特》组成的鸿篇巨制《荷马史诗》实在是太长了,Allison 想通过一种编码方式使得它变得短一些。一部《荷马史诗》中有 nn 种不同的单词,从 11 到 nn 进行编号。其中第 ii 种单词出现的总次数...原创 2019-03-21 20:54:55 · 305 阅读 · 0 评论 -
【算法·字符串】字符串的最小表示法(最小同构串)
习题:necklaceDescription有一天,袁同学抨了一条价值连城宝石项链,是,一个严車的间题是,他竟然忘记了项链的主人是谁!在得知此堊后,很多人向同学发来了很多邮件,都说项链是自己的,要求他归还:显然其中最多只有一个人说了真话袁同学要求每个人都写了一段关于自己项链的描述:项链上的宝石字囗至;来标示。一个对于项链的表示就是从项链的某个宝石开始,顺指针绕一圈,沿途记下经的宝石,比如如下...原创 2019-03-21 19:59:59 · 268 阅读 · 0 评论 -
【算法·哈希】哈希Hash判重算法入门
大整数判重对于一个大整数,如果你需要判重,即知道一个数字是否已经出现过,如果这一个数值很小的话,我们可以直接用数组进行桶排,暴力用数组下标标记,这样十分简单的就能够知道一个数字是否已经出现过了。但是如果一个数字的数值非常大,超出了数组所能够承受的空间大小,我们就需要使用Hash来进行解决。对于一个数值,对它进行一大大整数取模,这一个取模的值就是这一个数字的哈希值。即:Hash[x]=x&nb...原创 2019-03-21 19:18:16 · 1913 阅读 · 0 评论 -
【习题·贪心】Color A Tree(贪心+数学证明)
题目描述有一棵树,需要给其所有节点染色,每个点染色所需的时间是一样的都是11.给每个点染色,还有一个开销“当前时间×ci×ci”,cici是每个节点的一个权值。(当前时间是染完这个节点的时间) 染色还有另一个约束条件,要染一个点必须要先染好其父节点,所以第一个染的点是根节点. 求最小开销。Solution可以说是非常难的一道题目了。对于为了使花费最小,如果当前能够选到所有点里那个最大的...原创 2019-03-17 15:06:39 · 374 阅读 · 0 评论 -
Genius ACM(倍增+归并优化)
Problem【问题描述】Advanced CPU Manufacturer (ACM) is one of the best CPU manufacturers in the world. 每天, 该公司生产n台CPU并销售到世界各地。ACM公司的质检部门会对生产出的CPU进行成组测试,对一组(若干个)CPU进行测试的方法如下:随机从该组CPU中选取m 对(即2m 台),若总数不足2...原创 2019-03-14 18:13:05 · 1709 阅读 · 0 评论 -
[NOIP2016]蚯蚓(单调性证明)
Solution问题描述本题中,我们将用符号 ⌊c⌋⌊c⌋ 表示对 cc 向下取整,例如:⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3⌊3.0⌋=⌊3.1⌋=⌊3.9⌋=3。蛐蛐国最近蚯蚓成灾了!隔壁跳蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮他们消灭蚯蚓。蛐蛐国里现在共有 nn 只蚯蚓(nn 为正整数)。每只蚯蚓拥有长度,我们设第 ii 只蚯蚓的长度为 aiai (i=1,2,…,...原创 2019-03-13 21:10:18 · 288 阅读 · 0 评论 -
[NOIP2012]国王游戏(贪心证明·邻项交换)
ProblemDescription恰逢 H 国国庆,国王邀请 n 位大臣来玩一个有奖游戏。首先,他让每个大臣在左、右手上面分别写下一个整数,国王自己也在左、右手上各写一个整数。然后,让这 n 位大臣排成一排,国王站在队伍的最前面。排好队后,所有的大臣都会获得国王奖赏的若干金币,每位大臣获得的金币数分别是:排在该大臣前面的所有人的左手上的数的乘积除以他自己右手上的数,然后向下取整得到的结果。...原创 2019-03-13 20:36:40 · 566 阅读 · 0 评论 -
【算法·搜索】第k小整数:O(n)
利用快速排序的思想,每一次找到一个基准数并确定这一个基准数的位置,得到这个数的下标,再根据其下标大小来确定是向左区间找还是向右区间找;这里每一次都要讲小于基准数的搞到左边,大于基准数的搞到右边,那么就能在接近于O(n)的时间内得到答案。#include <bits/stdc++.h>using namespace std;int n,m,k;int a[1000000];in...原创 2019-03-11 16:09:01 · 268 阅读 · 0 评论 -
【算法·离散化】离散化的简单实现与运用
有关离散化有一些数值的绝对数值过大,但是数据个数相对较小,为了方便统计,且需要去重,我们引入了离散化这一概念。在离散化中,每一个绝对数值都对应的映射一个离散数值。例如有n=3时有三个数{107,108,109}\{10^7,10^8,10^9\}{107,108,109},这三个数的绝对数值较大,但是n较小,如果题目对绝对数值对答案没有意义只是起到了相对大小的比较或者统计的作用,我们可以吧这三...原创 2019-03-10 19:11:54 · 372 阅读 · 0 评论 -
【递归·数学·习题】 Fractal Streets:分形图问题
Problem题目描述城市的规划在城市建设中是个大问题。不幸的是,很多城市在开始建设的时候并没有很 好的规划,城市规模扩大之后规划不合理的问题就开始显现。而这座名为Fractal 的城市设 想了这样的一个规划方案,如下图所示:当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方 式建设在城市周围,提升城市的等级。对于任意等级的城市,我们把正方形街区从左上角...原创 2019-03-08 20:19:06 · 598 阅读 · 0 评论 -
【数论·分治·习题】约数和
题目描述给定两个自然数A和B,S为A^B的所有正整数约数和,编程输出S mod 9901的结果SolutionA=a1b1∗a2b2∗...∗akbkA=a1^{b1}*a2^{b2}*...*ak^{bk}A=a1b1∗a2b2∗...∗akbk根据算数基本定理or唯一分解定理(我也不知道叫什么):约数和=(1+a1+a12+...+a1b1∗B)∗(1+a2+a22+...+a2b2...原创 2019-03-08 19:34:22 · 286 阅读 · 4 评论 -
【二分·习题】Best Cow Fence(实数域上的二分答案)
Problem题目描述农场主 John (简称 FJ) 的农场有一长排的 N (1 &amp;lt;= N &amp;lt;= 100,000)块地组成. 每块地有一定数量 (ncows) 的牛, 1 &amp;lt;= ncows &amp;lt;=2000.FJ 想修建环绕邻接的一组地块的栅栏, 以最大化这组地块中平均每块地中牛的个数.这组地块必须包含至少 F (1 &amp;lt;= F &amp;原创 2019-03-08 19:05:12 · 556 阅读 · 0 评论