- 博客(98)
- 资源 (3)
- 收藏
- 关注
原创 利用 tarjan 算法对有环图进行缩点重建
算法可以找出每个强连通分量,此时,将每个强连通分量打包成一个【大节点】即可,大节点的权重为该强连通分量中所有节点权重之和,最后重新建立一张有向图,图中的节点个数等于强连通分量的个数。很容易求解最大路径之和,但问题是,图中可能会存在环,且题目明确:每个点虽然可以经过多次,但权值最多只能算一次,因此如果存在环,就不能使用。试想一下:如果题目给的有向图中存在环,那能否将【环】抽象成【一个权值更大的点】,这样就可以将图转为 有向无环图,从而利用。允许多次经过一条边或者一个点,但是,重复经过的点,权值只计算一次。
2025-02-17 15:44:22
564
原创 题解:[NOIP 2015 提高组] 信息传递
之后每一轮中,所有人会同时将自己当前所知的生日信息告诉各自的信息传递对象(注意:可能有人可以从若干人那里获取信息,但是每人只会把信息告诉一个人,即自己的信息传递对象)。当有人从别人口中得知自己的生日时,游戏结束。在游戏里每人都有一个固定的信息传递对象,其中,编号为。号玩家都能从自己的消息来源得知自己的生日,同样符合游戏结束的条件。的强连通分量,在剩下的强连通分量中找节点个数最少的。个节点的强连通分量中,节点最少的个数是多少。的同学的信息传递对象是编号为。的同学的信息传递对象是编号为。游戏的流程如图所示。
2025-02-17 15:43:42
567
原创 图论:tarjan 算法求解强连通分量
有一个 nnn 个点,mmm 条边的有向图,请求出这个图点数大于 111 的强连通分量个数。第一行为两个整数 nnn 和 mmm。第二行至 m+1m+1m+1 行,每一行有两个整数 aaa 和 bbb,表示有一条从 aaa 到 bbb 的有向边。仅一行,表示点数大于 111 的强连通分量个数。提示数据规模与约定对于全部的测试点,保证 2≤n≤1042\le n \le 10^42≤n≤104,2≤m≤5×1042\le m\le 5\times 10^42≤m≤5×104,1≤a,b≤n1 \leq
2025-02-17 15:42:06
935
原创 题解:[ABC294G] Distance Queries on a Tree
因为这道题的权重在边上,所以初始化的时候,对于一条边有两个端点,那么这个边的权重会添加到 深度更大的节点上,深度小的节点不需要添加该权重。作为根节点,初始化为有向树,初始化出每个节点到根节点的距离。序,每个节点都有两个时间戳,一个是到达这个节点的时间戳。,以第一次到达该结点的时间戳作为节点编号进行树状数组操作。行,每行三个数,描述一个询问,格式如上。操作,输出一行一个数,表示该询问的答案。,然后计算出两个节点的最近公共祖先节点。,另一个是离开这个节点的时间戳。个节点的树,带边权,要进行。
2024-12-27 17:23:16
691
原创 [CSP-S 2024] 超速检测 题解
对于每辆汽车,如果行驶过程中有超速,需要计算出超速区间,对于所有的超速区间,需要检查下,这个区间中是否有监控,如果超速区间没有监控,那也可以归纳到没有超速的骑车,直接忽略掉就行,因此最终可以拿到所有【被拍到的超速车辆的超速区间】,把这些区间按照右端点排序,选择打开的监控,基于贪心的思想,要让打开的监控尽可能拍到更多的车辆,所以排序后的第一个车俩,要想拍到后面更多的车辆,就选【第一个小于等于超速区间右端点。的两个测速仪,此时三辆之前被判定为超速的车依然被判定为超速。的位置,每个测速仪可以设置开启或关闭。
2024-12-20 13:36:48
723
原创 字符串哈希题解:[BalticOI 2014 Day1] Three Friends
个点分为两组,一组为边界位置,一组为普通位置。其中边界位置有三个点,分别是 第一个位置、最后一个位置和最中间的位置。,然而这个题有一个难点在于如何求解一段连续子串中 删除一个字符后,其它剩余子串的哈希值。,是唯一的,按照题目要求也算,我刚开始把这个算作不唯一了,踩了一坑。,对于一个字符串,求一段连续子串的哈希值,我们已经非常熟悉了。梳理清楚了以上思路,这个题就算完成了,下面就是码代码了。是一样的,这种情况也算唯一,比如字符串 “的字符,等价于将子串一分为二,右边。,为了易于思考,我将。
2024-12-20 10:00:39
924
原创 题解:单调栈求解良好的感觉
由于区间均为正数,因此基于贪心的思想,区间越长,区间和越大,舒适程度肯定越高,因此这个问题转为。往左右两边扩散找最小值的做法,可以借助单调栈进行优化,先从左往右遍历,下标入栈,维护栈单调递增,假设当前要入栈的元素为。,记录保存,由于要保证栈单调递增,因此栈顶出栈,继续判断新的栈顶,直到栈为空或者栈顶对应的元素小于。天中的感受值,请问,在哪一段时间,kkk 感觉最舒适?这个题的区间是不定长的,因此如果要枚举所有区间,则需要。,然后计算舒适程度,求出最大舒适程度即可。一行,表示在最舒适的一段时间中的感受值。
2024-12-20 09:59:24
883
原创 字符串哈希 保你能看懂
之前我们都接触过二进制、八进制、十进制、十六进制等等,这个时候,我们可以把字符串也当成一个进制数,比如。值,然后借助 数组排序后比较相邻元素是否相等,可以统计出不同字符串的个数。,字符串内包含数字、大小写字母,大小写敏感),请求出。有了上面的铺垫,这道题就很简单了,计算每个字符串的。答案是可以的,通过观察可·以发现,如果相求字符串。输出包含一行,包含一个整数,为不同的字符串个数。函数,将字符串转成整数,通常可以这样定义。行每行包含一个字符串,为所提供的字符串。是一样的,所以所提供字符串的集合为。
2024-12-20 09:57:46
724
原创 最近公共祖先 LCA:[GESP202312 八级] 大量的工作沟通
题目描述某公司有 NNN 名员工,编号从 000 至 N−1N-1N−1。其中,除了 000 号员工是老板,其余每名员工都有一个直接领导。我们假设编号为 iii 的员工的直接领导是 fif_ifi。该公司有严格的管理制度,每位员工只能受到本人或直接领导或间接领导的管理。具体来说,规定员工 xxx 可以管理员工 yyy,当且仅当 x=yx=yx=y,或 x=fyx=f_yx=fy,或 xxx 可以管理 fyf_yfy。特别地,000 号员工老板只能自我管理,无法由其他任何员工管理。现在,有一些同事
2024-12-20 09:53:18
781
原创 初等数论:同余
同余指两个数a和b除以另一个数m后,余数相同,则称a和ba≡bmodm举个例子,10除以3,商3余17除以3,商2余110÷33⋅⋅⋅⋅⋅⋅17÷32⋅⋅⋅⋅⋅⋅1以上两个公式可以统称为107310≡7mod3。
2024-07-24 14:13:56
839
原创 图论:倍增求解最近公共祖先LCA
上面的代码问题是:向上找父亲,一层一层走太慢了,并查集如果不做路径压缩,也是一层一层找父亲,层数过大会导致效率贼低,因此并查集做了路径压缩。记录和保存下来每个节点的不同层级的祖先,按照距离进行划分,距离为1,表示上一级祖先(爸爸);距离为4,表示上四级祖先(即爷爷的爷爷)。最近公共祖先LCA是NOI大纲中指定的提高组的图论部分的知识点,难度系数为6,提高组考察难度为5~8。树是一种特殊的图,有没有想过一个问题,给你一棵多叉树,随机给出两个节点,求解两个节点的最近公共祖先?还记得并查集路径压缩吗?
2024-06-04 15:11:02
1024
原创 RMQ问题之ST表
上面方法2中,f[i][j]表示区间[i,j]的最大值,现在重新定义f[i][j]:以i为起点,长度为2^j的区间,如此一来,f数组的第二维就很小了,比如方法二中的f数组第二维应该是n(n<=10^5),由于是二维数组,所以整个数组的大小为10^10,这个数组占多少空间呢?4、第二个区间为:[y - 2^j + 1, y],这个区间的最大值就是f[y - 2^j + 1][j],所以区间[x, y]的最大值为:max(f[x][j], f[y - 2^j + 1][j])。并向下取整转为int;
2024-04-29 17:37:25
698
原创 染色法判定二分图 竟然这么简单
染色法,顾名思义,就是给每个节点染色,由于是二分图,因此我们有两种颜色,比如颜色1和颜色2,通过dfs或者bfs搜索的时候,给每个节点进行染色,如果染色过程中,出现冲突,比如一条边相连的两个节点u和v都是同一个颜色,那么说明不是二分图,返回false即可,如果搜索完后,每个节点都有了颜色,并且没有出现冲突,那么说明就是二分图。我发现洛谷上竟然没有二分图判定的模板题,这很不利于初学者的学习,因此我做了一点微薄的贡献,提供了一道判定二分图的模板题,并配置了20个测试用例。
2024-04-29 09:45:22
237
原创 Floyd算法求多源汇最短路
Floyd算法步骤很简单,简单粗暴的三层循环,第一层循环遍历中间节点k,第二层循环遍历起点i,第三层循环遍历终点j,目的是从节点i走到节点j,如果可以通过i走到k,然后从k走到j,且这种方式的权值更小,那么更新dist[i][j] = dist[i][k] + dist[k][j]。初始化dist[i][j]为节点i到结点j的距离,那么dist[i][j]=0,节点到节点自己的距离肯定为0,其次,如果i和j相连,那么初始值为两节点边的权值,dist[i][j]=w,否则均为无穷大INF。
2024-04-29 09:42:38
324
原创 最小生成树算法:Kruskal算法 真香
说明:优快云和公众号文章同步发布,需要第一时间收到最新内容,请关注公众号【比特正传】。之前的图论合集文章中讲了图的存储遍历、最短路等算法,文章链接如下。
2024-04-10 10:11:26
283
原创 CSP-S 真题:格雷码
说明:优快云和公众号文章同步发布,需要第一时间收到最新内容,请关注公众号【比特正传】。题目来源:CSP-S 2019年 T1题目考察点:递归、搜索题目链接:https://www.luogu.com.cn/problem/P5657。
2024-03-24 21:06:49
517
原创 拓扑排序 很简单
Step2:针对Step1中找出的节点,依次访问这些节点的相邻结点,并将其相邻结点的入度-1(相当于删除了当前入度为0的点,所以相邻结点的入度会-1),然后判断相邻结点的入度,如果-1后等于0,那么将其加入队列。这道模板题呀,很简单,由于题目没有说,因此不需要考虑一些异常情况,比如图的连通性,如果在拓扑排序中有冲突怎么办等等,因此我们只需要考虑它的正常情况就行了,非常适合新手练习拓扑排序,自己动手完成吧。理解了这道题的意思,就很容易理解拓扑排序是什么意思了。入度:在有向图中,指向自己的箭头的个数。
2024-03-13 07:40:57
400
原创 Trie树(字典树)就是这么简单
说明:优快云和公众号文章同步发布,需要第一时间收到最新内容,请关注公众号【比特正传】。任何一种数据结构或者算法都是为解决某一个问题而诞生的,Trie树也是如此;比如:给n个字符串,需要查询q个字符串,判断这q个字符串是否存在于n个字符串中,或者q个字符串是n个字符串中多少个字符串的前缀。如下图所示:最简单的办法就是遍历n个字符串,然后依次判断,如果满足要求,数量+1,最终输出结果。但是看看题目数据范围,这样做肯定会超时,因此可以用Trie树来解决该问题。
2024-02-26 09:28:52
862
原创 贪心 模拟:CSP-J 2023 公路
说明:优快云和公众号文章同步发布,需要第一时间收到最新内容,请关注公众号【比特正传】。上篇文章发布后,收到公众号后台私信,让我多写一些第2、3、4题的题解,读者如此合理的要求,必须满足。今天来看一篇2023年的普及组的第二题:公路。
2024-01-29 20:58:10
1460
原创 洛谷 P9748 [CSP-J 2023] 小苹果
即现有苹果3个一组,划分完后,还剩1个苹果,那么此次取走的苹果数量为n/3+1,剩余的最后一个苹果在本次就会被取走,哎等等,那我们想知道最后一个苹果(即编号为n的苹果)什么时候被拿走,不就是第一次出现mod为1的情况下嘛。有了上面三种情况,我们就可以不停更新剩余的苹果数量,直到为0即可,在更新过程中,也要找出第一次出现上面的【情况2】,即为第n个苹果拿走的时间。即现有苹果个数刚好为3的倍数,那么此次取走的苹果数量为n/3(每3个一组,一组取一个,共n/3个);
2024-01-26 10:37:33
739
原创 洛谷 P2415 集合求和
思考一下:对于所有长度为m的子集而言,任意一个元素出现的次数和是相等的,比如,m为1时(即子集长度为1),每个元素只出现一次;:假设必选a1, 那么因为子集大小只有1,所以其他【n】个元素选【0】个即可,即元素a1在子集大小为【1】的集合中,出现了。:假设必选a1, 那么在剩余的【n】个元素中可以再选【m-1】个元素即可,即元素a1在子集大小为【m】的集合中,出现了。:假设必选a1, 那么在剩余的【n】个元素中可以再选【1】个即可,即元素a1在子集大小为【2】的集合中,出现了。这个答案等于多少呢?
2024-01-18 20:11:26
516
原创 洛谷 P9868 [NOIP2023] 词典
思考一下,如果需要比较两个字符串的字典序大小,不需要比较整个字符串,比如当前用单词word1和其他n-1个单词比较的时候,只需要使用word1的最小的字母和其他单词的最大的字母比较,如果word1的最小字母大于等于其他某个单词wordx的最大字母,那么word1的最优字典序一定大于wordx的最优字典序,直接输出0,结束比较,否则word1的最小字母小于wordx的最大字母,那么可以让word1的最小字母排最前面,wordx的最大字母排最前面,即可满足题目所说的性质。本题考察点:【贪心、枚举、模拟】
2024-01-16 20:45:12
623
原创 NOIP2017 提高组 奶酪(DFS、BFS、并查集)一题三解
该题可以通过搜索来实现,找出所有的入口(即与下表面相切或相交的空洞)作为搜索的入口,在搜索的过程中,对已经搜过的空洞进行标记,每搜到一个空洞,判断是否为出口(即该空洞与上表面相交或相切),如果是,输出Yes,然后return,否则继续搜索,直到以所有入口为起点搜索完,还未找到出口,则说明不能从入口到出口,输出No并返回即可。A1:如果为入口,则空洞的纵坐标z小于等于半径r;题意:老鼠是否可以从下表面的空洞一直沿着空洞走到上表面,如果可以,输出Yes,否则输出No;Q1: 如何判断一个空洞为入口或出口呢?
2024-01-11 21:27:29
555
原创 二分再也不用担心搞不清楚了,一文理解透二分
有越界的风险,导致求解的mid错误,所以以后计算mid的时候,强制统一用mid = left + (right-left)/2;表示将最优解不保留在当前区间[left, right]中,因此当循环结束后,区间一定为空,即left > right,即使区间中只剩一个元素,也要判断是否为最优解,直到区间为空,因为最优解不保留在区间中,所以需要一个变量ans来保存最优解,所以一定会有right=mid-1(最大值最小问题)或者left=mid+1(最小值最大问题),没有风险,对于两类问题均可使用;
2024-01-07 21:32:46
1007
原创 洛谷 P1873 砍树 (二分 简单)
上一部分分析了题目的求解方法并可以通过暴力的方法依次从maxH到0遍历,找到第一个满足题目要求的高度即可,试想一个问题,如果某个高度hi砍树不能满足砍掉的树的高度和大于等于M,那么对于大于等于hi的高度hj来说也无法满足题意,理解了上面这个特性就可以通过二分来快速求解高度h了。也很简单,给你一个高度mid,遍历所有树木的高度,用sum记录砍掉的树的高度和,则如果当前树的高度小于mid,则没有得到树木,否则,在当前树上可以砍下树的高度减掉mid的差值的高度的树木,最终只需要判断sum是否大于M即可。
2024-01-05 13:08:31
776
原创 一文搞懂 归并排序及求解逆序对 真简单
试想在归并排序的合并数组的时候,如果出现左子数组中的a[i]大于右子数组中的a[j]时,由于左子数组是有序的,因此左子数组中a[i]后面的元素都大于a[j],因此以a[j]为y的逆序对有(a[i], a[j]), (a[i+1], a[j]),...,(a[mid], a[j]), 共mid-i+1个;Step1:通过递归的方式,将数组进行划分(每次将一个数组从中间一分为二,左子数组和右子数组),直到子数组的长度小于等于1停止,此时子数组一定是有序的(长度小于等于1的数组一定有序);
2024-01-04 12:45:19
676
原创 状态压缩DP 洛谷P1441 砝码称重
https://mp.weixin.qq.com/s?__biz=MzkwODU5NzU5Mw==&mid=2247483831&idx=1&sn=49b5cd7e003458e8f7d6ae204b30dbf4&chksm=c0c6c181f7b14897e0606e38dde3dfe79561dc37ddbdc0b1b16e802ace496fa9ff23f542482a&token=219447487&lang=zh_CN#rd
2023-12-04 16:10:15
351
模拟进程调度(GUI实现)
2019-05-17
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人