- 博客(24)
- 收藏
- 关注
原创 CSP-J2022 山东 题解
受疫情影响,山东省取消了 CSP-J 2022 认证活动,并于次年三月重新命题,在省内补办比赛。植树节快要到了,学校要组织志愿者去给树苗浇水。有一排树苗,编号依次是 0,1,2,…0,1,2,\dots0,1,2,…。现有 nnn 个志愿者去给树苗浇水,第 iii 个志愿者选定了一个区间 [ai,bi]\left[a_{i},b_{i}\right][ai,bi] ,表示第 iii 个志愿者将 [ai,bi]\left[a_{i},b_{i}\right][ai,bi] 这一区间内的每一棵树都浇一次
2025-03-30 00:30:50
691
原创 leetcode 2360 图中最长的环 题解
我们直接说结论,我们从任意一个点出发,用一个数组存下来到达每一个点的最短步数,如果发现一个点之前已经被遍历过了,那么这个点一定是一个环的起点和终点,环的长度是当前的步数减去这个点的最短步数。所以当我们遍历的时候,所有经过的点和边形成的一定是一个链型的结构。当发现有一个点重复遍历的时候,一定是返回到了链上前面的某一个点,形成了一个环,我们统计一下答案就好了。任意两次遍历是互不影响的,或者说一个环只可能出现在具体的一次遍历当中,所以当我们完成一次遍历的时候,直接把这次的点全部都删了就行,不然复杂度就上来了。
2025-03-29 22:05:14
515
原创 字典树 / trie树
当我手里有若干个字符串的时候,现在向你询问某个字符串时候是前面的这些字符串中的其中之一。如果我们用暴力的做法来求解的话,我可能需要对这些字符串进行逐一比对,效率是相当低的。那么这个时候我们就可以用 trie 树的结构简单高效的解决这个问题。这个结构实现的原理有点像主席树(跑题了),字典树的根节点是一个空间点,没有任何含义,仅仅表示这棵字典树遍历的一个起点。然后从根节点开始,构建我们的字典树,例如:把 “abcd”, “acd”, “bcd”, “abce” 这四个字符串构建成一棵字典树。
2025-01-10 19:41:01
439
原创 leetcode 3266 K次乘运算后的最终数组II 题解
当 k 非常大的时候,很显然整个数组都会变得 “差不多一样大”,因为每次对最小的元素进行一个乘法操作,当 k 非常大的时候,数组中所有的元素都会变成 multiplier 的某次方然后乘上一个很小的数,这个数就是题目中给出的数组中的元素(相对于乘上的数很小)。例如上面这张图上的样例,当数组变成了 [8, 8, 6, 5, 6] 的时候,其中所有的元素都满足乘以 2 之后是数组的最大值,后面就开始进行了重复的乘法操作。我们发现在元素的选择上,貌似当数组达成了某些条件之后,元素的选择就会陷入循环。
2024-12-14 18:04:27
1122
原创 leetcode 2931 购买物品的最大开销
首先我们通过贪心可以显然得到,我们先买便宜的,然后再买贵的一定是最优的做法,其次我们从小到大枚举所有的物品,不会破坏题目中必须先买最便宜的物品的要求,因为当我们购买一个物品的时候,与其同一个商店并且更便宜的商品肯定已经被购买完毕了。n 个商品全部都买下来,每天买一个,但是每次只能买某一个商店里面的最便宜的那一个,代价是当前的天数乘以这个物品的价值。一共有 m 个商店,每个商店都有 n 个物品,每个物品有一个价值,然后现在我们要把这 m。直接说结果,我们把所有商店的物品集中到一起排序,然后从小到大依次购买。
2024-12-12 11:08:24
316
原创 leetcode 684 冗余连接 题解
这题用鸡毛并查集啊,直接 tarjan 求割边呗,为了水这篇题解,我还专门写了个 tarjan 的博客,嘿嘿。
2024-10-27 18:12:53
466
1
原创 tarjan求割点、割边
首先引出割点和割边的概念,给定一张无向连通图,选定一条边,当我们把这条边从图中删除的时候,如果整个图分裂成了两个子图,那么我们管这条边叫做割边或者桥。割点也是同理,删除这个点之后,如果整个图分裂成了两部分,那么我们管这个点叫做割点。
2024-10-27 18:03:27
814
原创 2024 CSP-J 题解
题目给出了一整套牌的定义,但是纯粹在扯淡,完全没有必要去判断给出的牌的花色和点数,我们用一个循环来依次读入每一张牌,如果这个牌在之前出现过,我们就让答案减一。这里建议用map、unordered_set或者给每一种牌一个编号,然后用数组存储也可以。
2024-10-27 14:53:10
1422
原创 leetcode25 K个一组翻转链表 题解
有一个重要的点,就是大家要维护好整个链表的第一个节点,因为虽然题目给出了第一个节点的指针,但是在我们的骚操作之后,这个指针就会发生变化。我的操作是新建一个新的节点,然后让这个节点的 next 来保存第一个节点的信息,最后我们就只要返回这个节点的 next 就行了。假设用五个点表示链表的一部分,其中中间三个点是一组的,我们的第一步就是让他们内部的指向正确,具体的步骤是这样的,我们用三个指针 tmp、tmp1、tmp2 一步一步的完成操作。最后就是这样的了,中间的三个节点翻转,而且不影响其他的点。
2024-07-30 22:52:40
1004
原创 leetcode135 分发糖果 题解
第一个 for 循环是判断哪些小朋友位于递增的子数列里,因为他右边的第一个和他不一样的值如果比他大的话,那么他所处的位置肯定就是递增的,但是一定要注意最后一个位置,即使他左边的值比他大,他也有可能只被分到一颗糖果,一会给大家举个例子。同理,第二个 for 循环是判断哪些小朋友处于递减的子数列里面,因为他左边的第一个跟他不一样的值如果比他大的话,就是处于递减的位置。但是这里有一个恶心的地方,就是如果两个挨着的小朋友rating值一样,分到的糖果谁多谁少都无所谓(感觉题面出的很不切实际[doge])。
2024-07-14 15:15:06
919
原创 leetcode1766 互质树 题解
早起一看今天的题吓我一跳,好家伙 “互质树” 听起来就是一个非常 diao 的题,题面看起来也非常 diao,但是看完数据范围就发现这题有点拉了。
2024-04-11 07:05:07
1959
原创 C和C++ 结构体 对齐方式 大小
首先第一个变量a占用四个字节,偏移量为0,然后第二个变量b偏移量是4,占用一个字节,在此之前不需要多余的填充,然后因为变量c是最后一个变量,所以直接占用一个字节,偏移量为5。因为大小已经是1的倍数了,所以最后也不需要填充字节。首先变量a作为第一个变量,相对于结构体的偏移量为0,占用一个字节,然后就是三个填充字节,这样使得变量b的偏移量为4(对齐长度)的倍数,最后就是变量c了,占用一个字节,但是为了使得整个结构体的大小同样为4的倍数,所以会在最后面再次添加三个填充字节,所以总共是12个字节。
2023-11-17 21:26:19
102
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人