算法竞赛进阶指南(ACM培训)
文章平均质量分 77
包含算法书上的题解,供大家参考
xjsc01
这个作者很懒,什么都没留下…
展开
-
算法竞赛进阶指南 0x24 迭代加深
答案在浅层,因为通过[1, 2, 4, 8, 16, 32, 64, 128],可能的情况的层数少于8层。但是对于广度优先,本来挺好,但是在队列里面存储太多的元素,到时爆。达达希望一次搬掉尽量重的一些物品,请你告诉达达在他的力气范围内一次性能搬动的最大重量是多少。当这一层没有答案的时候,把限定的层数增加,再次搜索。对于深度优先,如果答案在很浅的部位,但是整个搜索树过于深,那么就会寄掉。对于每个测试用例,输出一个满足需求的整数序列,数字之间用空格隔开。这一道题目采用双向搜索,先搜索前一半,然后再搜索后一半。原创 2022-09-24 11:50:48 · 275 阅读 · 0 评论 -
算法竞赛进阶指南 0x22 深度优先搜索
翰翰和达达饲养了只小猫,这天,小猫们要去爬山。经历了千辛万苦,小猫们终于爬上了山顶,但是疲倦的它们再也不想徒步走下山了(呜咕>_原创 2022-09-18 15:25:35 · 83 阅读 · 0 评论 -
算法竞赛进阶指南 0x21 树与图的遍历
在进入某一个节点以及离开这一个节点进行回溯的时候,记录一次编号,得到长度为`2*N`的序列。原创 2022-09-09 17:20:12 · 175 阅读 · 0 评论 -
算法竞赛进阶指南 0x68 二分图的匹配
详细解释了二分图匹配的相关算法原创 2022-09-01 18:14:29 · 214 阅读 · 0 评论 -
算法竞赛进阶指南 0x67 Tarjan 算法与有向图连通性
有向图G=(V,E)中,如果存在一个点r,使得从r出发,那么就可以到达所有的节点,那么称G为一个流图,记作(G,r)原创 2022-08-25 20:49:39 · 221 阅读 · 0 评论 -
算法竞赛进阶指南 0x65 负环与差分约数
这里与最短路密切相关可以使用spfa,利用spfa的原理(cnt数组),如果发现一个点是通过了超过n-1条边更新而来,那么就说明存在负环给定一张个点、条边的有向图,每个点都有一个权值[],每条边都有一个权值[]。求图中的一个环,使“环上各点的权值之和”除以“环上各边的权值之和”最大。输出这个最大值。:数据保证至少存在一个环。输入格式第一行包含两个整数和。接下来行每行一个整数,表示[]。再接下来行,每行三个整数,,[],表示点和之间存在一条边,边的权值为[]。输出格式。原创 2022-08-20 12:31:35 · 196 阅读 · 0 评论 -
算法竞赛进阶指南 0x58 数据结构优化DP
表示覆盖1~i的区间,所需要的最少的奶牛数目,这样也是混乱,因为并不知道这些情况中区间覆盖的最右端究竟是在哪里。你需要帮助约翰排列出一个合理的奶牛的清理班次,使得每个班次都有奶牛在进行清理,而且动用的奶牛数量可以尽可能的少。在实际的情况下,并不需要完全枚举T,因为如果对于某一个i,不是以右端点结尾的,那么。输出一个整数,表示在每个班次都有奶牛清理的情况下,所需的奶牛最小数量。]时间段内都有奶牛在清理,并且所需支付给奶牛的报酬最少。如果无法做到在要求时间段内都有奶牛清理,则输出−1。...原创 2022-07-31 11:00:46 · 151 阅读 · 0 评论 -
算法竞赛进阶指南 0x57 倍增优化DP
前方高能!!!原创 2022-07-30 09:56:22 · 214 阅读 · 0 评论 -
算法竞赛进阶指南 0x54 树形DP
树状DP就是以 子树大小,节点的深度 为阶段。当一个节点的最优解仅仅和他的儿子有关系,那么就可以。原创 2022-07-26 00:10:56 · 252 阅读 · 0 评论 -
算法竞赛进阶指南0x14 Hash
因为所需要数据量过于大,所以只能以O(n)的复杂度。所以不可能在实现的过程中一一顺时针逆时针进行比较,所以采用一种合适的数据结构。如果使用set里面存储pair套上pair,维护起来稍微有一点麻烦。取一个两片相同雪花都有的共同特征,(不同的重复也没事)。普及一个比较大的质数:99991字符串哈希:把一个任意长度的字符串映射成一个非负整数,冲突的概率几乎为0。方法步骤:一般来说,通过这种方法构造出来的Hash值是唯一的。如果不放心的话,可以多取几组p,如果全部相等,才能认为字符串相等。对于一个灰常长的原创 2022-06-28 11:05:00 · 147 阅读 · 0 评论 -
算法竞赛进阶指南——0x15 字符串学习笔记
AcWing\141. 周期思路:在KMP字符串匹配中,并不会直接考KMP,而是会考KMP的引理。也就是:定义nxt[i]是指当前位置下的最大数,这个最大的数字所具有的性质就是使得1nxt[i]和i-nxt[i]+1len相等。对于任意一个候选项,若存在一个小于j的候选项,那么这个候选项最大就是nxt[j]。对于这道题目,同样也有一个定理:存在循环元的充分必要条件就是:S[1~ j] == S[len-j+1~len]这个字符串是相等的,并且len-j可以整除len充分性:因为len-j可以整除,并..原创 2022-06-28 17:40:32 · 171 阅读 · 0 评论 -
算法竞赛进阶指南0x33同余
如果整数a,b除以正整数m的余数相同,那么a,b模m同余 。AcWing97. 约数之和一看:显然不能使用暴力。一提到数论,应该下意识想起分解质因数。AcWing203. 同余方程原创 2022-07-05 16:13:20 · 375 阅读 · 0 评论 -
算法竞赛进阶指南0x34矩阵乘法
因为矩阵满足结合律,所以可以使用快速幂来进行计算。规律总结:矩阵加速设计到两个东西:状态矩阵转移矩阵可以抽象出一个一维向量,在每一次递推就变化一次;状态转移方程不发生变化;状态转移过程中,一定是线性的(加减,乘以系数)注意:状态矩阵需要尽可能短,转移次数可以比较大。时间复杂度是N^3logNN 3 logN....原创 2022-07-02 18:45:56 · 198 阅读 · 0 评论 -
算法竞赛进阶指南0x35高斯消元与线性空间
高斯消元对应的矩阵有两种:这道题目重点是考察解线性方程组(不太好用暴力来进行解题)使用解线性方程组来进行求解ACWing208. 开关问题(点击访问)暴力枚举显然是不行。如果直接取思考解决问题的方法,不太可能。这时候应该与数学相联系。同时,容易发现:最终操作的结果与按压开关的次序并没有关系。可以存放一个矩阵(A[i][j]==1,则操作第i个开关会影响第j个开关。特别让A[i][i]==1A[i][j]==1,则操作第i个开关会影响第j个开关。特别让A[i][i]==1A[i][j]==1,.原创 2022-07-04 19:35:39 · 146 阅读 · 0 评论 -
算法竞赛进阶指南0x36组合计数
多重集先对合数进行分解的代码:运行结果Catalan定理证明如下:证明要点:容易得到:总共有 C2nnC^n_{2n}C2nn 种情况。现在思考不成立的情况:建立映射:容易证明:已知一个不合法的原情况,可以映射到Q。而在Q中,也可以映射到P。说明两个集合相互包含,进而得到两个集合相等。故个数相等。所以不合法的情况有 C2nn−1C^{n-1}_{2n}C2nn−1 种。相减,得到Katalan数列的个数。C2nnn+1{C^{n}_{2n}}\over{n+1}n.原创 2022-07-07 17:36:04 · 181 阅读 · 0 评论 -
算法竞赛进阶指南 0x38 概率与数学期望
设样本空间为Ω,对于该样本空间中的任意一个随机事件,都有实值函数P(A)P(A)P(A)使得P(A)大于等于0P(Ω) 等于1对于两个互斥事件(不可能同时发生),两个事件所组成的随机事件概率是两个随机事件分别发生的概率之和。即随机变量的取值以及期望的乘积之和。**性质:**期望是线性函数eg. 对于投掷两枚骰子,点数之和的数学期望就相当于是投掷一枚骰子所得点数的期望乘以2.注意位运算的性质:位运算的一位上的数字不会影响其他位数。计算可能情况的概率然后累加所有情况乘以概率即可。但是如果使用O(N原创 2022-07-08 18:35:02 · 395 阅读 · 0 评论 -
算法竞赛进阶指南0x41并查集
并查集的两类操作:Get 查询任意一个元素是属于哪一个集合。Merge 把两个集合合并在一起。基本思想:找到代表元。注意有两种方法:使用一个固定的值(查询方便,但是在合并的时候需要修改大量的值,比较复杂)使用树形结构,这样合并的时候可以直接让一个叫另一个...原创 2022-07-07 15:53:09 · 140 阅读 · 0 评论 -
算法竞赛进阶指南 0x43 线段树
英文名称:Segment Tree相比于树状数组,是一种更加通用的结构。线段树的规律研究:除去最后一层,发现线段树是一个完全二叉树。所以可以像二叉堆那样,使用一个数组来存储整棵二叉树线段树的高度是logNlogNlogN对于具有N个节点的满二叉树,需要有2N−12N-12N−1个节点。但是对线段树,最后一层也许会有枝叶,所以应该创建4N4N4N的数组。下面使用维护一个区间最大值的这一个任务来熟悉线段树的基本使用父亲节点对应区间的最大值等于两个儿子节点的最大值的最大值线段树的建立方法:修改操作查询原创 2022-07-13 11:40:37 · 254 阅读 · 0 评论 -
算法竞赛进阶指南 0x50 总论
采用从前往后推的方法方法二思考这一种状态可以由哪些推过来当询问最长子序列是哪些的时候896. 最长上升子序列 II这一道题目不能再使用动态规划来进行求解必须采用更为快速的这道题目恰恰使用到了贪心的思想。数组里面存放了(当前当前位置之前,所有)长度为 i 的上升子序列的最小的末尾元素(只需要一个代表元,那就是结尾的元素)依次从左向右进行扫描,对比 a[ i ] 和dp数组里面的值。竟然更加简单闫氏DP分析法状态:代表在A序列里面以结尾,在B中结尾的序列。转移:对于一共有以下四种情况:包含,包原创 2022-07-14 11:48:59 · 117 阅读 · 0 评论 -
算法竞赛进阶指南0x51 线性DP
本文章关于这一节的所有例题的详细解答,欢迎参考原创 2022-07-16 20:44:46 · 314 阅读 · 1 评论 -
算法竞赛进阶指南 0x52 背包
/n表示的是商品的数目,m表示的是背包的容积。//第i个物品的体积intw[100];//第i个物品的价值intmain(){i原创 2022-07-24 10:27:59 · 569 阅读 · 0 评论 -
算法竞赛进阶指南 0x53 区间DP
线性DP:从初态开始,沿着阶段的扩张,向某一个方向扩张,知道求出答案。区间DP是一种特殊的线性DP,同时也与线段树等树形结构具备相同的特征。阶段:区间的长度(一个转态要从比他小的区间并且包含于他的区间递推过来)转态:左端点,右端点。注意:先是阶段,然后状态,最后决策...原创 2022-07-25 10:41:43 · 148 阅读 · 0 评论 -
算法竞赛进阶指南——字典树学习笔记
AcWing142. 前缀统计这道题目很显然会想到使用字典树(应为可以使用树来对不同前缀的进行分叉)AcWing\143. 最大异或对字典序就是把这道题目如果使用俩俩逐个进行比较,显然是不行。对于这道题目,我一开始想象,如果随着输入一遍之后直接通过树来得到结果,显然是不行。对于如图所示的情况,第一层可以选择不相同的,但是第二层不知道是左面是0还是右面是0,这样就需要不断试探。。。。。。3. 看了一下数据范围,输入数据,需要O(n)O(n)O(n),其实可以使用O(nlog2n)O(nlog_2n原创 2022-06-29 00:25:05 · 119 阅读 · 0 评论 -
算法竞赛进阶指南——链表学习笔记
AcWing\136. 邻值查找题面这道题目让我想起了平衡二叉树,可以使用map进行实现链表的实现(log2Nlog_2Nlog2N)瓶颈在于排序。链表是线性结构。插入以及删除是O(1)的时间复杂度。但是不支持随机插入,可是删除却很快。需要删除的指针可以在开始一链表的形式初始化好。总结:链表插入删除快链表查找一个元素难链表在前期通过维护指针,可以快速找已经在链表里的这道题使用链表的精髓就在于按照顺序排序,然后根据输入的顺序倒过来根据指针数组查找在链表里面找到前驱以及后继。原创 2022-06-26 23:14:38 · 240 阅读 · 0 评论 -
算法竞赛进阶指南——队列学习笔记
队列和他的变种:我采用一个队列,表示小组的总的排行,然后使用小组个数个队列来保存每一个组里面的队列。通过我这样一波操作,可以在队列的队列里面进行Push和PopACWing蚯蚓133在这道题目,蚯蚓的长度是随着时间在进行着变化,可以知道,长度可以表达成y-t平面内的一个直线。斜率已知,使用每一只蚯蚓的初始长度来表达蚯蚓的长度(这样到最后输出时以及在比较过程中统一,好比较)。这道题目可以使用优先队列来进行,但是时间复杂度是mlog2nmlog_2nmlog2n 所以不太可能实现。这时候就需要进行原创 2022-06-26 19:32:39 · 215 阅读 · 0 评论 -
单调栈_Largest Rectangle in a Histogram
https://www.acwing.com/problem/content/133/通常,直方图用于表示离散分布,例如,文本中字符的频率。现在,请你计算在公共基线处对齐的直方图中最大矩形的面积。图例右图显示了所描绘直方图的最大对齐矩形。输入包含几个测试用例。每个测试用例占据一行,用以描述一个直方图,并以整数 n开始,表示组成直方图的矩形数目。然后跟随 n个整数 h1,…,hn。这些数字以从左到右的顺序表示直方图的各个矩形的高度。每个矩形的宽度为 1。同行数字用空格隔开。当输入用例为 n原创 2022-06-23 16:36:31 · 66 阅读 · 0 评论 -
【无标题】
这道题目我套用了之前移动汉诺塔的递归程序,其实这里并没有必要去模仿如何移动汉诺塔,仅仅需要找出关系就可以。而我所找的关系没有得到证明,就直接使用,导致数据错误。如果实在不好找到答案,使用暴力求解可能会更好一些。...原创 2022-05-04 17:02:54 · 332 阅读 · 0 评论 -
ACWing95. 费解的开关
题解这道题目有三个状态条件值得考虑:每一个开关被按0次或者1次才有意义,如果超过1次,那么等同于按0或1次。最终的结果与按的顺序无关因为2,所以可以人为地规定比较合理的顺序。现在以每一行为顺序。先经过一波操作把上一行全部搞成1,然后看这行,如果有0,那么只能按下一行的,以此类推。起始状态难以把握,但是我们可以使用暴力枚举。暴力地把第一行分割为2^5种情况。...原创 2022-05-04 09:30:46 · 178 阅读 · 0 评论 -
ACWing94. 递归实现排列型枚举
题面把 1∼n 这 n个整数排成一行后随机打乱顺序,输出所有可能的次序。输入格式一个整数 n。输出格式按照从小到大的顺序输出所有方案,每行 1个。首先,同一行相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面。数据范围1≤n≤9输入样例:3输出样例:1 2 31 3 22 1 32 3 13 1 23 2 1题解——无赖做法#include <bits/stdc++.h>using namespace原创 2022-05-02 22:56:39 · 206 阅读 · 0 评论 -
ACWing93.递归实现组合型枚举
题面\93. 递归实现组合型枚举从 1∼n这 n 个整数中随机选出 m个,输出所有可能的选择方案。输入格式两个整数 n,m,在同一行用空格隔开。输出格式按照从小到大的顺序输出所有方案,每行 1个。首先,同一行内的数升序排列,相邻两个数用一个空格隔开。其次,对于两个不同的行,对应下标的数一一比较,字典序较小的排在前面(例如 1 3 5 7 排在 1 3 6 8 前面)。数据范围n>0,0≤m≤n ,n+(n−m)≤25输入样例:5 3输出样例:1 2 3原创 2022-05-02 22:31:21 · 99 阅读 · 0 评论 -
ACWing94.递归实现指数型枚举
https://www.acwing.com/problem/content/description/94/题面\92. 递归实现指数型枚举从 1∼n这 n个整数中随机选取任意多个,输出所有可能的选择方案。输入格式输入一个整数 n。输出格式每行输出一种方案。同一行内的数必须升序排列,相邻两个数用恰好 1个空格隔开。对于没有选任何数的方案,输出空行。本题有自定义校验器(SPJ),各行(不同方案)之间的顺序任意。数据范围1≤n≤15输入样例:3输出样例:322 3原创 2022-05-02 22:09:26 · 303 阅读 · 0 评论