期末测试补题报告 现有若干个区间组,要把当前区间组接到一个右端点离它左端点最近的区间组,这样可以使空隙变小。如果现有的区间组右端点都不小于当前区间的左端点,那么把当前区间独立成一个新的区间组。所以,不妨先把所有区间按照左端点排序,这样可以使区间右端点尽可能靠前,然后依次考虑每一个区间,每次找右端点最靠前的区间组,如果能放进去,就改变右端点;反之,就加入一个新的区间组。的矩阵地图,在地图上有些点是山或者其他障碍物,不可以通过,除此之外所有点都可以走。),考虑状态压缩,把字符串看作一个二进制数,转换成十进制保存。
带权并查集 每进行一轮游戏时,每个人都会把自己已知的所有信息告诉传递对象,同时接收别人传来的信息。当有一个人从别人那里接收到自己的信息时,游戏停止。名同学,每名同学都有一个固定的传递对象(非本人,一个人可能同为多个人的传递对象)。也就是说:当环里的一名同学的信息在环中传递了一遍,最后又传到自己时,游戏就停止了。有 n 个人,刚开始每个人都代表着一个家族,现在要对其进行。可以发现,一个环里如果信息能够顺畅传递,必然含有根节点。,因为每个点自为一个集合,自己到自己的距离是。,输出一个整数表示点 a 所在家族的人数。
折半搜索 折半搜索的本质就是把要搜索的范围分成两份,降低时间复杂度。例如,对于一个n×mn\times mn×m的地图,要想从左上角搜索路径到右下角,且只能每次下移或右移一格,则dfs()的时间复杂度大约是O2nm−1O2nm−1(左上角到右下角要移动nm−1(n+m-1)nm−1格,每到一格都要考虑右移和下移两种路径,做222此选择,所以一共是2nm−12^{n+m-1}2nm−1次选择)。如果nm−140n+m-1=40n。
[USACO18DEC] S 补题报告 消除后剩下的干草又会因为重力下落,它们当中有可能会组成新的可以消除的连通块……当最后一头乘坐某辆车的奶牛到达的时候,这辆车就可以发车了。如果没有到达,那么其他要乘坐这辆车的奶牛就要等待到发车的时刻。来统计连通块内干草的数量。相同类型的且相连(上下左右方向相邻) 的若干干草成为一个连通块。:不断重复搜索连通块、标记可删除连通块、整理屏幕过程,知道无可删除连通块为止。没有想到连通块在屏幕任何地方都可以删,而是只删了屏幕底下的连通块。求等待时间最长的奶牛等待的时间的最小值。等待时间最长的奶牛等待的时间的最小值。
字符串算法习题分析 中的一个字母的位置重合,这两个字母满足映射关系,一一对应说明每一个字母都有映射关系,满足题意。,为了先找到满足题意的周期,再考虑无合法周期,所以要等于。给出一个串,求出其所有前缀的最大周期长度之和。其所有字母的位置都一一对应,满足映射关系,则。的前缀的最长周期是(这里公共前后缀就用。中每一种出现过的字母的位置关系都可以与。确实没有合法周期,此时算作空串)。所有的公共前后缀的最小值;的一个公共前后缀的长度,则。特别地,如果没有满足的。而且,为了满足题目要求,的一个公共前后缀的长度;的最长公共前后缀,所以。
KMP进阶 (1)用KMP找出 BBB 和 CCC 在 AAA 中出现的区间既然所求的子串 sss 要同时包含 BBB 和 CCC,不妨在 AAA 中找到 BBB 和 CCC 出现的位置,再考虑寻找最短的子串 sss。利用类型的 l1,r1,l2,r2l1,r1,l2,r2l1,r1,l2,r2 分别存放 BBB 和 CCC 在 AAA 中出现的区间的左、右端点。特别地,如果 BBB 和 CCC 其中一个在 AAA 中一次也没有出现过,那么必然不存在 sss,结果为 。(2)枚举 BBB 区间 二分寻找最近 CCC
KMP算法 KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。[1][1]KMP算法的时间复杂度为OnmO(n+m)Onm。原有的传统暴力字符串匹配算法中,当匹配模式串和主串出现错误时,需要退回起始位置,而KMP算法的效率在于,当匹配模式串失败后不会退回,而会根据错误信息继续向后匹配。KMP算法的提出者之一——
Codeforces Round 719 (Div. 3) 补题报告 的矩阵,使得一个单元的相邻的单元(上、下、左、右挨着的单元)的数值与其不相邻(数值相邻是指两个数绝对值等于一)。每天只能做一项任务,如果一项任务分成了多次做,且中间又做了其他的任务,则会被怀疑。靠拢的总步数是最少的。如果做过,而且有间隔,则会被怀疑。在十进制符号中的所有数位都相同,我们就称它为普通数。第三遍 bfs:求不走传送门的时间(可能不存在路径)。不同的是,如果每个数遍历检查实在太慢,可以先记录。的值,值相同的就能组成索引。比较走和不走传送门的时间,求最小值。求出如果走传送门,需要的最短时间。
哈希冲突 而判断一个串的循环节,要按照它的因子从大到小判断。为了使字符串的下一个子串的长度尽可能长,所以前者的长度一定要除以一个最小的不为。利用 set 去重的特性,把两种哈希值作为一个 pair 存入 set,去重后个数即为所求。如果使用普通哈希解决问题,可能会发生哈希值重复的情况,这就是。而且,大多数题目会制定一些特殊数据,所以,这个值可能。而欧拉筛的性质就是尽可能用最小的质因子筛掉数字。组数据,因此一道题目的总错误率为。可以发现,每个数字的最小的不为。的因子,得到后者的长度。的因子是其最小的质因子。
字符串哈希 个字母的密文,前一半为密文,后一半为前者的明文,但后面部分内容缺失,输出尽可能短的未残缺密文。哈希(Hash)算法是一种能够将任意长度的输入转换成固定长度数据(哈希值)的算法。显然,要找到密文的一个最短的前缀,使得前缀等于后缀的密文(前缀后缀等长)。从冲突位置向后找空余的地址,如果到尾部则从头开始,直到找到空间存放。求出每个外文单词的哈希值,查询时比较哈希值,相同时输出英文。为固定长度(通常是一个较大的质数),把每个数字填到对。为密文,还原后的完整密文是。为密文,还原后的完整密文是。
Codeforces Round 905 (Div. 3) 补题报告 我们可以从出现奇数次的字母入手,如果出现奇数次,删去一个,使它成为偶数;不能删了,就记录下奇数的个数。如果重合,那么其他的片段也必然重合。每组数据有一个四位密码。过大, 要让操作次数尽可能小且仍要满足条件,则设。问最少进行多少次操作,能使数组成为一个非递减数组。每次操作后,判断集合中是否存在一对片段不重合。能够快速排序和删除,还要满足不去重的特性,请计算输入给定的四位密码所需的最少秒数。,和一个仅包含小写字母的字符串。重新排列,能否构成一个回文串。的值,删除使用时取相反数即可。,也就是找到最小的一个大于。
并查集及应用 为了判断两个点是否在同一个集合里,我们不能直接判断它们的父亲是否相同,因为可能存在父亲不相同,祖父相同,或者祖父的祖父相同……为了便于理解,我们让集合里的点构成一些父子关系(事实上,集合里的这些点并没有拓扑关系,是平等存在的),对于每个点,我们只关心它的父亲。,那么这个集合内的球一定可以从顶部到达底部(中间不可能断开,因为在同一个集合里)现有两个集合(单个的点也看做一个集合),需要合并为一个集合,简单的方法就是。在集合里,祖先只是一个集合的标志,便于我们进行判断和操作的一个点。是关键字,我们定义函数名为。
单调队列及应用 现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。从左往右遍历数组,如果队尾元素大于等于当前元素,则将队尾元素出队,知道队列为空或小于为止。单调队列找最大值,如果当前元素的两倍小于队头,则队头标记。显然,当歌曲里的最大值仍比最小值的两倍小时,无论从哪首歌开始,都不会停止。列,因此,遍历这个范围内的数,找到最大值和最小值差最小的数即可。的正方形区域,使得该区域所有数中的最大值和最小值的差最小。方阵的右下角,它的值是这个方阵内数字的最小值。,就会产生负面情绪,立刻停止播放。
单调栈及应用 从左往右遍历数组,把每个元素入栈,如果栈顶元素大于等于当前元素,则将栈顶出栈,一直到栈为空或者栈顶元素小于当前元素为止。,表示一个序列的长度,然后输入这个序列,输出序列每个元素的左边最近的比它小的数字,如果不存在则输出。类似地,我们可以找到左右端点(方法完全相同),然后计算出每组矩形构成的大矩形的面积,求出最大值。由题意和图可知,在连续的几个矩形中,最大对其矩形是以最矮的矩形高度为长、以矩形个数为宽构成的。的数列,要求找出一个子区间,使这个子区间的数字之和乘上子区间中的最小值最大。
01分数规划 所给的模板是寻找所有满足条件的实数中最大的(最靠右的),颠倒第5、7行改为寻找最小的(最靠左的)。的数列,找出该数列的一个子串,使得子串平均数最大化,并且子串长度。,可知二分时应选择尽可能大的答案,所以在二分过程中,最终结果和。个实数,因此精度相当高。,选出多个物体,使得能够最大化或最小化表达式。表示答案所要求的精度,即结果的精度精确到。它的具体使用方法与上一种相同,答案保存在。类型的函数,题目的核心就在于此。场,求出可获得的最高总平均分。的值,进行排序,逃避最小前。次的二分完全绰绰有余。
【数论】欧拉函数 函数具备两个要素——值域和定义域。值域fx定义域x−1xfx非特殊要求情况下,定义域为正整数的函数。nmfmnfmfnnmfmnfmfn1n1表达式:如果表达式为真,则等于1;反之等于0。εnn1单位函数也是一种。