- 博客(14)
- 收藏
- 关注
原创 CF1760E
所以我们只要用前缀和的思想来记录0,1个数,然后遍历,看那个位置上可以增加的越多,就选择那个位置取反.所以说如果我们把一个位置上的1变成了0,那么我们就会失去这个位置上1的贡献,得到0的贡献.题目的意思就是最多对一个数取反,然后看逆序对最大是多少,我们分析一下,将一个数字取反后,这样我们就要思考,关于一个数,对于逆序对个数的贡献是怎样的.我们肯定是要让逆序对的数量增加的越多越好.如果是1那么总对数就是在它右边的0的个数;如果是0那么总对数就是在它左边的1的个数.如果把一个位置上的0变成了1,就反过来.
2023-12-14 21:17:33
284
1
原创 洛谷P1020 [NOIP1999 提高组] 导弹拦截
这道题是狄尔沃斯定理的应用,所求的第一个数字是最长不降子序列,由狄尔沃斯定理我们就可以的到第二个数是求最长上升子序列的长度。从第一行到第二行,207被300取代,因为300更长,更靠外,比207好,所以直接抛弃207选用300。对于每一个新入栈的数,用二分找到第一个小于它的数的位置,替代掉。(模拟一下,前面都是递减直接略过,最后面就是递减我就省略了)最后我们就得到长度6,我们只维护长度,数组大小就是长度。这两个数字求法一样,都是利用单调栈的思想。
2023-12-07 17:13:12
355
原创 洛谷P1880 [NOI1995] 石子合并(区间dp)
这个题目是个环形,我们可以拆换成链,把这个环拉直,然后变成一个长度为2*n的链,这样就可以覆盖环形时的所有情况了.也就是说对于一个区间[i,j] 我们可以枚举一个中间的点k , 找到最优的那一种。比如说总共有4堆石子 我们要将它们合并 那么合并的最后一步有哪几种方案。因为我们是从区间长度短的来获得长的所以我们需要枚举区间长度。第二种 前两堆 和 后两堆 合并起来 ( 都指合并完)我们很难直接的找出先合并哪一些是最优的,然后举个例子。第一种 把第一堆和后三堆已合并完的合并起来。
2023-12-05 20:55:03
157
1
原创 洛谷P1342 请柬(单源最短路dijkstra)
这道题目跟模板差不太多,不同的是它还要求每个点到起点的最短距离,因为我才刚开始学 , 第一时间我想到就是把每个点都当作起点,跑一遍 如果是1为起点的话就把 d[1] 到 d[n]累加起来, 不是1的话 就累加a[1]然后想一想,有太多的操作是没用的,太浪费时间了,然后我想了想看能不能反向建边。然后自信提交 , 果不其然 喜提4个tle。这样就不用跑那么多次了, 就有了下面的代码。
2023-11-30 20:56:57
225
1
原创 洛谷P1825 [USACO11OPEN] Corn Maze S(bfs)
这道题是bfs对比于其他最简单的来说只是多了一个传送门的特判而已,又因为最多也就26个传送门;我们只要再开一个结构来存储传送门的起点和终点就可以了,下面看代码实现,附带注释。
2023-11-28 21:28:05
201
1
原创 洛谷P1162 填涂颜色(dfs)
这道题目就是dfs搜索,仔细观察你会发现最外围那一圈一定不会被包围,所以我就从边界上的每一个点开始搜索,把遇到的0都打上标记,如果是1的话就不搜索。下面看代码实现(附带注释)
2023-11-18 19:52:43
171
1
原创 P1434 [SHOI2002] 滑雪 (记忆化搜索 , 优先队列)
这道题目需要记忆化搜索,如果普通搜索的话,我们有的时候会用到之前所搜索到的结果,这个时候如果我们再去搜索就没有必要了,重复的计算会浪费很多时间, 如果我们记录之前搜索的答案就可以直接使用,节省时间.因为这个题目只能从低向下滑,那如果我们从从低到高的话,就可以了,先算低的点对后面算高的点没有影响 这就是我们为什么要用优先队列了。f[6]=f[5]+f[4] , 如果我们在之前有记录, 就可以直接使用了 ,就像我们通过循环来实现斐波那契数,下面直接看代码(附带注释)下面直接看代码(附带注释)
2023-11-16 21:12:35
390
1
原创 洛谷B3612 题解
p[i] =a[1] + ... + a[i] 其实也就是 p[i]= p[i-1] + a[i]这里简单讲一下一维前缀和 它的用处在于可以以O(1)的时间复杂度求出子段和 下面说说是如何实现的。比如说我们现在要求 [l,r]的子段和 我们只要让 p[r]-p[l-1] 即可。p是前缀和数组 , a是原数组。这道题是一维前缀和的模板题。
2023-11-14 21:51:26
226
1
原创 洛谷P4447 [AHOI2018初中组] 分组 (ac代码+注释)
所以我们每次加入组员的时候,把组员加入到人数最小的组,因为n最大1e5,如果直接遍历的话,时间复杂度为O(n),会爆掉,所以我们用更快的二分查找。所以说在我们查找的时候应该让它尽量靠右,也就是尽量增大,找到那个符合条件,且最新的那个小组来加入新组员。这道题我是用贪心加二分查找做的,写的像答辩,随便看看了,我们要让人数最少的组人数最大值,同时我们发现如果是一个越新的小组,那么它的人数就会越少,又刚好符合我们的贪心策略,具体看下面代码(附带注释)
2023-11-05 21:53:33
571
原创 洛谷P2678 [NOIP2015 提高组] 跳石头(ac代码+注释)
这个时候我们只需要验证是否mid符合我们要求,也就是说如果两块石头距离超过mid,就搬走,统计需要搬走的石头数量cnt,如果这个cnt小于等于M的话,我们就去查找mid的右区间,如果比M大的话就是查找左区间。所以我们就得到答案一定在一个区间[0,L],如果`一个个遍历个话,时间复杂度为O(N),会超时,所以我们采用时间复杂度比较优秀的二分。实际上我们可以发现答案一定在一个范围内,这个答案一定不会超过起点和终点的距离。这道题的数据比较大,如果直接暴力求解的话,时间一定是会超时的。
2023-11-03 00:15:00
355
1
原创 阶段考试一位运算题解
通过递归(当然也可以用循环来实现)来获得一个整数的二进制,这里贴一个补码的递归我们就可以得到 这个数的补码 并且从0到31是从低位到高位(这个感觉很像我们手算十进制化二进制,可以自己模拟一下)得到补码后让a[tag]=1 再化为十进制即可第一种,暴力,不想多说其实回过头来看,第二种跟第三种非常的相似,第二种不断的除于2,像是一种右移的过程,直到把第tag位移到第0为上来判断,而第三种是把1移到第tag位上,再通过按位或,把u的第tag位置为1。
2023-11-02 14:15:10
77
原创 洛谷P1102 A-B 数对(双指针解法,ac代码带注释)
现在要考虑的是如何找到这一区间,我们要找到这一个区间的左端点和右端点,在我们将这一个数组排序了之后我们发现了左端点和右端点是随着B的增大而增大的,它们是单调不降的,所以我们可以用两个指针来表示左端点和右端点.这道题首先我们可以先将这一串数字排序,然后我们把A-B=C转换成A-C=B来看,其实也就是对于每一个B来说它对应的A都有一段连续的区间。给出一串正整数数列以及一个正整数 C,要求计算出所有满足 A−B=C 的数对的个数(不同位置的数字一样的数对算不同的数对)。第一行,两个正整数 N,C。
2023-11-01 00:15:00
435
原创 双指针算法学习总结
双指针(two pointers)是一种很好用的算法,感觉也可以说是一种小技巧吧,它在优化代码上可以给我们提供很大的帮助。
2023-10-31 04:00:00
124
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人