- 博客(58)
- 收藏
- 关注

原创 [数据结构]并查集(系统整理版)
每次合并把元素少的连通块合并到元素多的去。维护一个size数组s 初始化为1。最后cnt即为最后的连通块个数。这样合并能时树的高度增长相对少。减少路径压缩次数 提高查询效率。初始化cnt为元素个数n。因为并查集类似树形结构。每次合并时 cnt–
2025-03-29 10:24:51
639
原创 [leetcode]1462. 课程表 IV
如果课程 a 是课程 b 的先决条件,课程 b 是课程 c 的先决条件,那么课程 a 就是课程 c 的决条件。q次询问 给出一个queries数组 返回每个询问是true/false 以数组形式返回。给定n个课程 ,一个二维数组。这样查询的时候只需要。
2025-04-01 20:41:35
213
原创 [leetcode]2685. 统计完全连通分量的数量
完全连通分量:就是一个连通块中 ,所有点之间都两两有边相连。一个完全联通分量有n个点 那么应该有。连通分量就是一个连通块的意思。给定无向图,求完全连通分量。检查每个联通分量是否有。
2025-03-31 17:15:52
232
原创 [leetcode]2492. 两个城市间路径的最小分数(并查集 排序后建边)
如果1和n联通 并且这条边在1和n的这个连通块中。遍历每条边 每次合并边的起点和终点。求1-n的路径中最小的边权是多少。
2025-03-31 14:34:39
257
原创 如何在set和priorty_queue中自定义排序方式
首先 默认为大根堆 top为最大的元素结构体当然要自定义排序方式 上面的就是实现默认大根堆顺序 把score最大的放在top看小于号方向就行了 都是重载的小于号 只要return里的不等号也是小于号 那么就是默认大根堆顺序如果要改成小根堆 就把不等号改成大于号就行。
2025-03-30 20:08:54
455
原创 [leetcode]547. 省份数量
这是图论非常入门的题了吧 不过我才刚会做哈哈哈。其实非常简单 接下来要开始系统地学图论和dp了。就是遍历每个点 如果没有被标记过 就cnt++并且对他搜索 把所有跟他联通的点都标记上。给定一个邻接矩阵 求有几个连通块。其实很简单 不过我做这题时才知道。就是把cnt初始化成元素个数。这个题意很显然可以并查集做。每次合并时cnt–就行了。
2025-03-29 08:21:18
331
原创 [leetcode]1749. 任意子数组和的绝对值的最大值(dp)
前缀和 遍历尝试以[1,n-1]每个元素作为子数组结尾的情况 对n个sum取max。这样[j+1,i]的子段和就是[0,i]中所有子数组和最大或者最小的。这里使用set维护前面的子段和 也可以开一个大根堆和一个小根堆。对于每个点作为结尾 考虑前面的子段和[0,j]最小或者最大。dpmx[i]表示以nums[i]结尾的子段中最大子段和。dpmn[i]表示以nums[i]结尾的子段中最小子段和。求任意一个子数组和的绝对值的最大值(子数组可以为空)对于最大子段和、最小子段和分别动态规划。最后对abs取max。
2025-03-28 19:35:41
469
原创 [leetcode]打家劫舍I+II(dp)
比上题多了个限制条件 就是0号位置和n-1号位置也视为相邻。dp[i]表示下标[0,i]这些能选的最大数字。一个数组 不能选相邻数字 求能选到的最大总和。nums[0]要么选 要么不选。
2025-03-27 11:14:14
274
原创 [leetcode]2258. 逃离火灾(多源BFS+贡献法+二分答案)
给定n×m的地图0 表示草地。1 表示着火的格子2 表示一座墙火每分钟会按照四联通蔓延到草地上人每分钟可以走一步 从左上角出发 到右下角每分钟是人先走 火再蔓延 但是人不能走到某个格子上 同一分钟火就烧到这个点上来了。
2025-03-25 10:02:55
629
原创 [leetcode]1263. 推箱子(A*+优先队列BFS+DFS)
这题有一个要特别注意的点 箱子也占一格 可能会把人挡住 所以不能一开始就用并查集预处理空白点的联通性 要动态判断两点间的联通性。不是人走的步数 人可以走任意步数 每次推箱子 要走到箱子移动方向的另一头 如果此时没有路能到这个点 就不能推。'S’是玩家初始位置 'B’是箱子初始位置 'T’是箱子目标位置。比如有时候人在箱子右边 上下都是墙 人就会被箱子挡住。箱子在同一个点 人在箱子左边 这时候就不会被挡住了。因为箱子在同一个点 而人在不同的点的状态是不同的。其实这题的数据范围应该不压缩也一样能开得下。
2025-03-22 15:13:30
1063
原创 [洛谷](记忆化搜索&int类型dfs)P1434 [SHOI2002] 滑雪
不需要vis数组 因为保证只能从高往低走 不会出现往回走的情况。数据不大 可以枚举每一个点作为起点dfs 对ans取max。的地图 每个点是一座山的高度 只能从高向低滑。从任意点开始 求最长路径。
2025-03-22 09:00:00
270
原创 [leetcode]864. 获取所有钥匙的最短路径(状态压缩bitmask+bfs)
说回bitmask 二进制上每一位代表这一位所对应的钥匙是否获得 通过c-'a’进行映射。在二进制意义上看 最多6个钥匙 也就是最多。保存这个状态的坐标 走的步数 当前钥匙状态。目的是收集所有钥匙 不一定要把门都打开。‘.’ 代表一个空房间。
2025-03-21 14:43:12
482
原创 [leetcode]1631. 最小体力消耗路径(bool类型dfs+二分答案/记忆化剪枝/并查集Kruskal思想)
只需要维护每个点的联通关系即可 只要起点和终点联通 就代表一条完整的路径出现了 这个思路太妙了 实现起来很快。对路径体力值二分 每次check就是dfs一下能不能在这个高度绝对差不超过mid 的情况下走到终点。用并查集维护 一旦起点和终点在一个联通块内 就返回此时的边权(因为排序过了 一定是最大的边权)定义高度绝对差为四联通意义下相邻的两个点高度的绝对值之差。定义路径的体力值为整条路径上 所有高度绝对差的max。地图 要从(1,1) 走到 (n,m)求所有路径中 最小的路径体力值是多少。
2025-03-19 16:47:16
980
原创 CF1059B Forgery
给定一个n,m的目标矩阵初始矩阵全为′′你可以染色无数次,每次选定一个格子将它周围的八个格子(除它自己)的3*3矩阵覆盖成’#'。这个3*3的矩阵只能出现在n∗m的矩阵内部。不能越界。询问是否能构成目标矩阵。
2025-03-12 16:43:01
416
原创 [2025zjgsu校赛]G 演唱会
n×m的地图x是墙是空白位置1是人p是敌方乐队位置挑一个点 空白或者是行人所在位置开演唱会 每个行人会根据我们乐队和敌方乐队哪个距离近 就去听哪个演唱会 如果最短距离一样 就来听我们的求我们最多能获得多少观众。
2025-03-09 15:09:27
783
原创 [2025zjgsu校赛]E 异或大王
意思就是两个数组 以a数组为主 把所有a数组的异或和找出来 每个异或和可以异或上对应的b[i]也可以不异或找到第k大的异或和。
2025-03-09 14:35:46
226
原创 [蓝桥杯]路径之谜
从左上角走到右下角 四联通方向 每走到一个格子 向正北和正西射一支箭 每个点只能走一次。idx表示上一次是第几步 (从0开始) 用于path数组记录 填充和撤销。因为x,y代表上一次走的点 既然上一次已经走到右下角了 就不要继续往下走了。x,y 表示上一个点的坐标 这一次dfs要通过(x,y)的四个方向扩展。另外 要判断每个行列的箭数目是否匹配 如果匹配才要输出path。这段代码注意要在x==-1&&y==n-1 时return。题目给出最后竖向和横向上的每个靶子上的箭的总数。
2025-03-08 10:26:05
1080
原创 [蓝桥杯]数字三角形(记忆化剪枝/DP)
①n为奇数 n-1为偶数 向下和向右各走(n-1)/2步 所以最终答案落在dp[n][(n-1)/2+1]所以最终答案对dp[n][(n-1)/2+1]和dp[n][(n-1)/2+2]取max即可。比最普通的数字三角形题目多加了一个限制 就是竖直向下的步数和向右下的步数之差<=1。②n为偶数 n-1为奇数 向右走(n-1)/2或者(n-1)/2+1步。这里必须对n分类讨论 如果n为奇数 但是还用②取max的方法会wa。在列方向上 只有向右下走的步数会对最终答案所在的列产生影响。
2025-03-07 22:48:33
458
原创 [蓝桥杯]岛屿个数
地图外的都是外海 可能会跟地图内的内海联通 那么把这些联通的内海都标记为外海。如果一个岛被另一个岛环住 就不统计入内 这个意思 看样例图比较好理解。if判断条件中要加上st[i][j]==0 不然会重复计算很多个岛屿。在if里面要记得把st[i][j]标记为1 不然这个起点会被重复走。给定一个n*m的地图 0是水 1是陆地 统计一共有多少个岛。我一开始把八联通的方向数组写错了 写成了。这两个我一开始都忘记了 导致我调了好久。实际上应该两个0 三个1和-1。只有与外海相连的岛屿才需要统计。
2025-03-07 19:26:27
423
原创 [蓝桥杯]飞机降落
可以证明 now只会变大 当前now都比rr大了 往后递归now永远比rr大 所以这架飞机一定没法降落 所以这种方案直接return 0就行了。n架飞机要降落 每架飞机能在[t[i],t[i]+d[i]]的时刻区间内降落 降落需要l[i]的时间。一架飞机降落完毕时,另一架飞机可以立即在同一时刻开始降落,但是不能在前一架飞机完成降落前开始降落。每个飞机有一个可降落时刻的区间[t[i],t[i]+d[i]] 降落耗时l[i]开一个状态数组 记录当前这架飞机有没有降落过。另外多组数据 记得初始化st数组。
2025-03-07 14:32:24
557
原创 [蓝桥杯]买瓜
②便于构造后缀和数组 用来判断当前买了的sum 就算把后面所有的都买了 如果还是到不了m 那就直接return 能避免很多不必要的递归。把每个a[i]都*2 m也同步*2 这样就避免了 double运算 我一开始用double做的 只能通过85%的样例。n个瓜 每个瓜重量a[i] 每个瓜最多劈一次 每次劈成一半一半 (可能劈成小数)num表示当前考虑到几号西瓜 cnt表示当前劈了几次 sum表示当前买的总重量。每个瓜劈开了 就一定要选 不然劈开是没有意义的。
2025-03-07 09:59:55
337
原创 [蓝桥杯] AB路线
给定n*m的迷宫 由A,B组成 从左上角出发 走到右下角有个特殊的限制 每次必须走k个A 然后再走k个B 再走k个A...最后一段A或B的格子可以走少于k格左上角保证为A 求最少步数。
2025-03-06 22:57:31
301
原创 AT_abc395_e [ABC395E] Flip Edge
再连接第一层和第二层 就是对于每个节点i 建一条无向边连接i与i+n 边权为x 如果走这条无向边 表示花费x 执行一次操作2 来到全部翻转有向边的第二层图的状态。最后把第二层建完 就是把题目输入的u->v 建成u+n<-v+n 边权为x 记得要把方向反过来。2:翻转所有边的方向u->v 变成u<-v 成本为给定的x。建完图之后 直接在整张图上跑最短路 堆优化版的Dijkstra。先建题目给出的有向图 每个边权为1。1:沿着有向边走一步 成本为1。求从节点1走到节点n的最小总成本。
2025-03-05 13:53:13
128
原创 AT_abc395_d [ABC395D] Pigeon Swap
维护一个数轴 数轴坐标id[a] 存储a号笼子对应的数轴坐标 通过笼子编号访问坐标 a为笼子编号。操作二时 交换a,b两个笼子 只需要交换id[a],id[b]上的笼子 之后再交换a,b对应的坐标。n个鸽子和笼子 编号1-n 每个鸽子在编号和自己一样的笼子里。f[id[a]]存储数轴坐标上对应的笼子的编号。开三个数组 f[N],id[N],st[N]数据范围很大 每次查询都要在o(1)完成。间接映射 有点巧妙 从洛谷的题解上学的。
2025-03-05 11:46:24
127
原创 CF2070C Limited Repainting
有一个字符串 全都是红色 给你一个字符串 是想要涂成的目标颜色 由蓝色红色组成还有一个数组 表示每个下标上的颜色如果不是目标颜色 所对应的惩罚值最多可以涂k次色 每次涂色可以涂连续的一段涂完之后的总惩罚值定义为所有与目标颜色不同的点上的惩罚值的max求最小的总惩罚值是多少。
2025-03-03 16:54:56
309
原创 CF1551B2 Wonderful Coloring - 2
cnt[a[i]]存的是当前用了多少个a[i] 这样搞的目的是正好可以用++cnt[a[i]]来染色 标记组号。如果剩下的元素少于k个了 说明剩下的元素不能平均地分配给k组了 这样就会导致k个组中的元素个数不同 所以这时候就要break。同时把freq<k的元素种类单独找出来 用结构体数组v存起来 同时保留该元素在原数组中的下标。n个数字,分成k组,每组内不能有相同元素,每组的元素数量相同。这类元素可以在所有k组里放一个 另外多余的就是0。freq[a[i]]存储每个元素的出现次数。
2025-02-27 15:58:02
253
原创 CF1520
也就是把pre[i-1]当成前面的这些点都已经移到了一起 计算pre[i]时 只需要把他们看作一个整体 再向右移动k步 所以要加上k*i。pre[i],suf[i]表示 以pos[i]为下标的 * 作为中心 把左边或右边的所有星号移到这个点旁边所需要的步数。pre[i]可以理解为 pre[i-1] 以pos[i-1]星号为中心的点 以及之前的所有点都向右移动k。定义k为pos[i]-pos[i-1]-1 也就是把当前枚举的这个点的前一个点 移动到这个点左边的步数。pre[0],suf[m-1]都为0。
2025-02-26 17:07:07
254
原创 [数据结构]Trie树
1.无论是ist还是query函数 里面的p=son[p][u]写在前面的if后面 但是不要加else 因为无论son[p][u]是否存在 p都要更新下去。3.son[i][j]表示 编号i的节点的子节点是不是j所代表的字母 如果是的话son[i][j]的值就是子节点的编号。2.编号0既表示根节点 又表示空节点 编号有idx分配。
2025-02-14 22:32:33
148
原创 [数据结构]ST表
首先l,r都-1 是因为题目给的是1-based 我们把数组改成了0-based 其次 r再-1 是因为差分数组之后 原数组大小-1 查询的右区间也-1 找个例子模拟一下就行。首先要初始化 遍历每个i 将st[i][0]赋值成a[i] 因为j==0表示区间长度为2^0 即1。内层循环遍历起点i 循环结束条件是区间终点不越界 也就是i+(1<<j)-1<n。也就是a[i,i+(1<<j)-1]内的gcd。都是2^(j-1) 区间合并刚好就是要求的区间。因为区间长度是r-l+1 加1还等于1<<j。
2025-02-14 22:30:34
280
原创 [数论入门]扩展欧几里得算法
定义:扩展欧几里得算法:https://www.acwing.com/problem/content/879/代码解释:递归调用:通解:
2025-02-13 19:37:38
245
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人