- 博客(36)
- 收藏
- 关注
原创 期末测试补题报告
现有若干个区间组,要把当前区间组接到一个右端点离它左端点最近的区间组,这样可以使空隙变小。如果现有的区间组右端点都不小于当前区间的左端点,那么把当前区间独立成一个新的区间组。所以,不妨先把所有区间按照左端点排序,这样可以使区间右端点尽可能靠前,然后依次考虑每一个区间,每次找右端点最靠前的区间组,如果能放进去,就改变右端点;反之,就加入一个新的区间组。的矩阵地图,在地图上有些点是山或者其他障碍物,不可以通过,除此之外所有点都可以走。),考虑状态压缩,把字符串看作一个二进制数,转换成十进制保存。
2024-06-10 20:32:07
709
原创 带权并查集
每进行一轮游戏时,每个人都会把自己已知的所有信息告诉传递对象,同时接收别人传来的信息。当有一个人从别人那里接收到自己的信息时,游戏停止。名同学,每名同学都有一个固定的传递对象(非本人,一个人可能同为多个人的传递对象)。也就是说:当环里的一名同学的信息在环中传递了一遍,最后又传到自己时,游戏就停止了。有 n 个人,刚开始每个人都代表着一个家族,现在要对其进行。可以发现,一个环里如果信息能够顺畅传递,必然含有根节点。,因为每个点自为一个集合,自己到自己的距离是。,输出一个整数表示点 a 所在家族的人数。
2024-05-05 20:10:57
923
原创 折半搜索
折半搜索的本质就是把要搜索的范围分成两份,降低时间复杂度。例如,对于一个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。
2024-05-04 18:28:18
1034
原创 [USACO18DEC] S 补题报告
消除后剩下的干草又会因为重力下落,它们当中有可能会组成新的可以消除的连通块……当最后一头乘坐某辆车的奶牛到达的时候,这辆车就可以发车了。如果没有到达,那么其他要乘坐这辆车的奶牛就要等待到发车的时刻。来统计连通块内干草的数量。相同类型的且相连(上下左右方向相邻) 的若干干草成为一个连通块。:不断重复搜索连通块、标记可删除连通块、整理屏幕过程,知道无可删除连通块为止。没有想到连通块在屏幕任何地方都可以删,而是只删了屏幕底下的连通块。求等待时间最长的奶牛等待的时间的最小值。等待时间最长的奶牛等待的时间的最小值。
2024-04-26 22:53:16
817
原创 字符串算法习题分析
中的一个字母的位置重合,这两个字母满足映射关系,一一对应说明每一个字母都有映射关系,满足题意。,为了先找到满足题意的周期,再考虑无合法周期,所以要等于。给出一个串,求出其所有前缀的最大周期长度之和。其所有字母的位置都一一对应,满足映射关系,则。的前缀的最长周期是(这里公共前后缀就用。中每一种出现过的字母的位置关系都可以与。确实没有合法周期,此时算作空串)。所有的公共前后缀的最小值;的一个公共前后缀的长度,则。特别地,如果没有满足的。而且,为了满足题目要求,的一个公共前后缀的长度;的最长公共前后缀,所以。
2024-04-18 22:59:37
611
原创 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
2024-03-31 20:39:11
1581
原创 KMP算法
KMP算法是一种改进的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt提出。KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。[1][1]KMP算法的时间复杂度为OnmO(n+m)Onm。原有的传统暴力字符串匹配算法中,当匹配模式串和主串出现错误时,需要退回起始位置,而KMP算法的效率在于,当匹配模式串失败后不会退回,而会根据错误信息继续向后匹配。KMP算法的提出者之一——
2024-03-25 21:36:11
1662
原创 Codeforces Round 719 (Div. 3) 补题报告
的矩阵,使得一个单元的相邻的单元(上、下、左、右挨着的单元)的数值与其不相邻(数值相邻是指两个数绝对值等于一)。每天只能做一项任务,如果一项任务分成了多次做,且中间又做了其他的任务,则会被怀疑。靠拢的总步数是最少的。如果做过,而且有间隔,则会被怀疑。在十进制符号中的所有数位都相同,我们就称它为普通数。第三遍 bfs:求不走传送门的时间(可能不存在路径)。不同的是,如果每个数遍历检查实在太慢,可以先记录。的值,值相同的就能组成索引。比较走和不走传送门的时间,求最小值。求出如果走传送门,需要的最短时间。
2024-03-16 23:32:33
962
原创 哈希冲突
而判断一个串的循环节,要按照它的因子从大到小判断。为了使字符串的下一个子串的长度尽可能长,所以前者的长度一定要除以一个最小的不为。利用 set 去重的特性,把两种哈希值作为一个 pair 存入 set,去重后个数即为所求。如果使用普通哈希解决问题,可能会发生哈希值重复的情况,这就是。而且,大多数题目会制定一些特殊数据,所以,这个值可能。而欧拉筛的性质就是尽可能用最小的质因子筛掉数字。组数据,因此一道题目的总错误率为。可以发现,每个数字的最小的不为。的因子,得到后者的长度。的因子是其最小的质因子。
2024-03-13 22:08:55
857
原创 字符串哈希
个字母的密文,前一半为密文,后一半为前者的明文,但后面部分内容缺失,输出尽可能短的未残缺密文。哈希(Hash)算法是一种能够将任意长度的输入转换成固定长度数据(哈希值)的算法。显然,要找到密文的一个最短的前缀,使得前缀等于后缀的密文(前缀后缀等长)。从冲突位置向后找空余的地址,如果到尾部则从头开始,直到找到空间存放。求出每个外文单词的哈希值,查询时比较哈希值,相同时输出英文。为固定长度(通常是一个较大的质数),把每个数字填到对。为密文,还原后的完整密文是。为密文,还原后的完整密文是。
2024-03-05 22:29:53
771
原创 Codeforces Round 905 (Div. 3) 补题报告
我们可以从出现奇数次的字母入手,如果出现奇数次,删去一个,使它成为偶数;不能删了,就记录下奇数的个数。如果重合,那么其他的片段也必然重合。每组数据有一个四位密码。过大, 要让操作次数尽可能小且仍要满足条件,则设。问最少进行多少次操作,能使数组成为一个非递减数组。每次操作后,判断集合中是否存在一对片段不重合。能够快速排序和删除,还要满足不去重的特性,请计算输入给定的四位密码所需的最少秒数。,和一个仅包含小写字母的字符串。重新排列,能否构成一个回文串。的值,删除使用时取相反数即可。,也就是找到最小的一个大于。
2024-02-02 17:49:22
916
原创 并查集及应用
为了判断两个点是否在同一个集合里,我们不能直接判断它们的父亲是否相同,因为可能存在父亲不相同,祖父相同,或者祖父的祖父相同……为了便于理解,我们让集合里的点构成一些父子关系(事实上,集合里的这些点并没有拓扑关系,是平等存在的),对于每个点,我们只关心它的父亲。,那么这个集合内的球一定可以从顶部到达底部(中间不可能断开,因为在同一个集合里)现有两个集合(单个的点也看做一个集合),需要合并为一个集合,简单的方法就是。在集合里,祖先只是一个集合的标志,便于我们进行判断和操作的一个点。是关键字,我们定义函数名为。
2024-02-01 11:35:17
800
原创 单调队列及应用
现在这个从左边开始向右滑动,每次滑动一个单位,求出每次滑动后窗口中的最大值和最小值。从左往右遍历数组,如果队尾元素大于等于当前元素,则将队尾元素出队,知道队列为空或小于为止。单调队列找最大值,如果当前元素的两倍小于队头,则队头标记。显然,当歌曲里的最大值仍比最小值的两倍小时,无论从哪首歌开始,都不会停止。列,因此,遍历这个范围内的数,找到最大值和最小值差最小的数即可。的正方形区域,使得该区域所有数中的最大值和最小值的差最小。方阵的右下角,它的值是这个方阵内数字的最小值。,就会产生负面情绪,立刻停止播放。
2024-01-31 13:12:49
930
原创 单调栈及应用
从左往右遍历数组,把每个元素入栈,如果栈顶元素大于等于当前元素,则将栈顶出栈,一直到栈为空或者栈顶元素小于当前元素为止。,表示一个序列的长度,然后输入这个序列,输出序列每个元素的左边最近的比它小的数字,如果不存在则输出。类似地,我们可以找到左右端点(方法完全相同),然后计算出每组矩形构成的大矩形的面积,求出最大值。由题意和图可知,在连续的几个矩形中,最大对其矩形是以最矮的矩形高度为长、以矩形个数为宽构成的。的数列,要求找出一个子区间,使这个子区间的数字之和乘上子区间中的最小值最大。
2024-01-30 12:08:21
859
原创 01分数规划
所给的模板是寻找所有满足条件的实数中最大的(最靠右的),颠倒第5、7行改为寻找最小的(最靠左的)。的数列,找出该数列的一个子串,使得子串平均数最大化,并且子串长度。,可知二分时应选择尽可能大的答案,所以在二分过程中,最终结果和。个实数,因此精度相当高。,选出多个物体,使得能够最大化或最小化表达式。表示答案所要求的精度,即结果的精度精确到。它的具体使用方法与上一种相同,答案保存在。类型的函数,题目的核心就在于此。场,求出可获得的最高总平均分。的值,进行排序,逃避最小前。次的二分完全绰绰有余。
2024-01-28 23:26:27
775
原创 【数论】欧拉函数
函数具备两个要素——值域和定义域。值域fx定义域x−1xfx非特殊要求情况下,定义域为正整数的函数。nmfmnfmfnnmfmnfmfn1n1表达式:如果表达式为真,则等于1;反之等于0。εnn1单位函数也是一种。
2024-01-05 23:21:43
963
1
原创 拓扑排序与动态规划
可以理解为:有向无环图的每一个节点都是一个事件,每个事件的邻接点表示只有完成当前事件才能进行的事件。拓扑序列就是解决所有事件的顺序。拓扑排序,就是寻找拓扑序列的算法。它能够将一个有向无环图转化成线性的方式存储。特别地,因为“单独的一种孤立生物不算一条食物链“,所以应当进行调整:入度为。:其中不存在从任何顶点出发并最终回到该顶点的路径的图。单独的一种孤立生物不算一条食物链。,我们都能获得它的拓扑序列。的节点可以到达的路径数量。:一个节点指向它的边数。),求其中的食物链条数。的节点如果有出度,则。
2023-12-16 22:44:29
954
原创 链式前向星
在树形网络中找到若干个节点,删除它和它的边,使删除后的网络各部分子网的节点数的最大值不超过总节点数的一半。如果没有一个可删除的节点,输出。注意,这道题中由于未知父亲节点和儿子节点,所以需要双向存边,遍历时需要处理非法的反向搜索。*在表示时为了方便,把NULL标记为-1。,顾名思义,就是在链表的头部插入元素。由此可知,这道题的答案是寻找树的重心。计算出每个点的子节点数,保存到。链表头插法的定义、插入函数。链式前向星的定义、存边函数。这种保存图的方法,就是。
2023-12-09 23:14:46
875
1
原创 树状数组2
查询:差分数组的前缀和结果等于原数组,所以。的正整数组成的序列。行:每行输入表示如题的某一种操作。行:每行输入表示如题的某一种操作。两个树状数组,一个差分(也就是计算。取出一些数字排在一起,这些数字是。根据这个公式,可求出操作2的值。最长上升子序列是指,从原序列中。的元素结尾的最长上升子序列。,表示给定数组的长度和操作数。对于每个2操作,输出对应结果。,表示给定数组的长度和操作数。对于每个2操作,输出对应结果。之间的最大值,即为所求的。之间的最大值,即为答案。这一部分),另一个计算。个整数,表示这个序列。
2023-11-25 23:36:23
814
原创 树状数组1
给出一个长为nnn的数组aaa改变axa_xax的值求∑i1xai∑i1xai并输出树状数组是一种树形结构的数组,以二叉树的方式进行存储。它的基本操作有:改变元素的值、求区间前缀和。树状数组的优越性在于其进行操作的复杂度都是OnlognO(nlogn)Onlogn。
2023-11-18 23:06:03
57
1
原创 ST表
有一天她发现了一盏神灯,可惜神灯里的精灵并不那么善良。kiki必须回答一个问题,然后精灵才能实现她的一个梦想。剩余的数字将形成一个新的整数。最大值的最大值(两个区间中间可能会有重复覆盖的情况,但由于是可重复贡献问题,不影响结果),也就是求。可重复贡献问题:每个元素会被重复用于求解答案,添加一些元素不会影响最后的答案。f 定义为 pair 类型,存放当前这一位的数字和编号。对于每种情况,在一行中输出您可以获得的最小结果。的值位置的情况,则改变预处理的策略:先遍历。最大值的最大值,也就是求。
2023-11-05 22:18:58
69
1
原创 优先队列和重载运算符
优先队列 priority_queue,即按照优先级自动进行排序的队列,属于STL容器中的一种。重载运算符,对运算符重新定义、加载,赋予运算符不同的含义的函数语法。大根堆的特点是,对于每个节点,其儿子节点一定要比父亲节点小。所以,大根堆的堆顶一定是所有元素中最大的一个。小根堆的特点是,对于每个节点,其儿子节点一定要比父亲节点大。所以,大根堆的堆顶一定是所有元素中最小的一个。一个堆,仅有堆顶(根节点)有意义,所以堆只有。两种操作,且删除的对象只能是堆顶。相同于堆,优先队列也分为两种。优先队列的底层实现是。
2023-10-28 23:25:09
420
1
原创 STL总结
可以通过键来查找值,但不可以通过值直接查找键。每一个键只有一个值与之对应,且键是唯一存在的。unordered_set 的底层实现是哈希 hash。与 map 的不同点在于,相同的键可以有多组键值对。与 set 的不同点在于,不对元素进行自动去重操作。与 set 的不同点在于,不进行自动排序操作。关系,即一种类型的值对应另一种类型的一个值。与 map 的不同点在于,不进行自动排序。STL,标准模板库,包含多种容器。与队列操作部分相同,但不同点是,访问STL容器元素的变量,与。set 的底层实现是红黑树。
2023-10-28 17:30:03
60
1
原创 (KDY)CSP-J模拟赛总结
传送门\colorbox{0E90D2}{\color{white}{\tiny \texttt{传送门}}}传送门题目:判断素数。没有考虑完全,注意数据范围,考虑每一个变量的范围。模拟,注意桶的使用。dp,最长不上升(下降)子序列。没有考虑到dp,不掌握dp的转移方程策略,和优化方法,没有想到最长不下降(上升)子序列以及查找的方法。贪心。没有想到贪心的思想和策略。本次模拟赛主要由于考虑不周全和对算法思想的理解和运用程度不够。
2023-10-04 19:39:24
101
1
原创 (KDY)CSP-J模拟赛五补题报告
还是要注意时间比重的调整。把更多的时间用在第三、第四道题上,尽可能地为后面的题目那数据范围里的10%~50%的点的方法留时间。注意多举例子。比如第三题,多举几个较长的,有概括性的,能够代表绝大多数情况的样例分析,可以节省很多的调试时间。
2023-10-04 18:18:30
136
2
原创 (KDY)CSP-J模拟赛四补题报告
这一次的做题策略有一定的提升,但是要注意时间的比重。尽快解决前两道题,多一点时间思考后面两道题的思考方向和获得更多分数的方法。前面两道题尽量少调试,在后面的题目的调试上多下功夫。
2023-10-03 18:39:00
112
原创 (KDY)CSP-J模拟赛三补题报告
第一题注意文件读写\huge\color{red}{注意文件读写}注意文件读写;第二题 注意做题策略,先分析前两道题,;第三题、第四题 学会通过样例和数据大小,推算思考方向和分类讨论(骗分)。
2023-10-02 19:03:06
96
原创 (KDY)CSP-J模拟赛二补题报告
第一题 没有考虑到第二种情况,不周全;第二题 没有想到简单的打表方法,要学会使用之前所学方法;第三题 没有通过样例分析题目,发现题目的整洁方法;第四题 dp,并学会骗分技巧。
2023-10-01 19:26:50
107
原创 【C++题解/洛谷】P1540 [NOIP2010 提高组] 机器翻译
题目描述中,“每当软件将一个新单词存入内存前,如果当前内存中已存入的单词数不超过 ,软件会将新单词存入一个未使用的内存单元;若内存中已存入 个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。如果内存中没有,软件就会在外存中的词典内查找,查出单词的中文含义然后翻译,并将这个单词和译义放入内存,以备后续的查找和翻译。,则标记队首单词为新单词并删除,在队尾插入新单词,并将其标记为已存单词。个单词,软件会清空最早进入内存的那个单词,腾出单元来,存放新单词。,软件会将新单词存入一个未使用的内存单元;
2023-02-03 15:11:37
1057
3
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人