随笔分类 -  OJ

摘要:PATA1007 题目要求求出最大子序列的各元素之和,并且输出最大子序列的第一个元素和最后一个元素的值。使用一个dp数组,dp[i]表示以第i个元素为末尾的和最大的序列。由于需要用到序列的首元素,所以在DP时就要记录。状态转移方程如下: \(dp[0].start=0;dp[0].v=dat[0]\ 阅读全文
posted @ 2022-06-03 16:40 带带绝缘体 阅读(50) 评论(0) 推荐(0)
摘要:这道题基本逻辑很简单,使用一个优先队列模拟哈夫曼树的建立。有这几个注意点: 从优先队列选结点构建新的节点时要注意判断队列的元素个数,防止出现剩余结点数少于叉数的情况。 每次选结点要先按照权值从小到大找结点,若权值相同再按照结点的深度从小到大找。可以自定义优先队列的比较函数,也可以使用pair来存储这 阅读全文
posted @ 2022-06-02 19:55 带带绝缘体 阅读(59) 评论(0) 推荐(0)
摘要:如果说对静态的数据找中位数,那么用快排或直接用partion方法来做即可。但当前题目要求的是动态的读取数据来输出中位数,即输出前1、3、5、7...个数据的中位数,那么就需要使用对顶堆来处理。 对顶堆使用两个堆,上面的堆up是小根堆,下面的堆down是大根堆,且必须满足小根堆的top要大于大根堆的t 阅读全文
posted @ 2022-06-01 19:32 带带绝缘体 阅读(40) 评论(0) 推荐(0)
摘要:这道题一眼就知道是并查集,创个int型数组按步骤写就好了。 哈哈如果这样想简单了就错了。看一下题目的数据范围: 编号最大值达到了$109$,但是不同的编号最多只有$2\times 105$个,问题就出在这里。如果创建一个有10亿个元素的int数组,那内存明显不够用。所以需要将数组离散化。这里使用ST 阅读全文
posted @ 2022-05-30 20:21 带带绝缘体 阅读(30) 评论(0) 推荐(0)
摘要:代码的注意点: AVL树重新平衡最核心的思想是找到离新加入的节点最近的失衡节点。 insert操作的基础是插入新节点前子树已经是一个AVL树,这是根据平衡因子判断树型的依据。 不要把BF作为node的成员变量,因为在左旋/右旋后BF的实际值就会改变,而在判断LL/LR/RR/RL型树时使用未更新的B 阅读全文
posted @ 2022-05-15 17:41 带带绝缘体 阅读(37) 评论(0) 推荐(0)
摘要:这道题的题意大概为根据所给的序列seq建立一棵BST,然后判断: 如果BST的前序遍历序列与seq相同,就输出BST的后序遍历序列; 如果BST的镜像树前序遍历序列与seq相同,就输出BST的镜像树的后序遍历序列。 思路很简单,分别求出BST的前序遍历序列与BST的镜像树的前序遍历序列,然后判断它们 阅读全文
posted @ 2022-05-12 20:00 带带绝缘体 阅读(41) 评论(0) 推荐(0)
摘要:这是一道关于树遍历的题。基本的思路是使用树的静态写法,即使用数组储存树。然后使用DFS进行搜索,注意使用剪枝的思想,即遇到已经不可能产生目标的路径时就放弃这一子树。 易错点在于对结果进行排序。《算法笔记》中关于这道题的解法是有问题的,它使用的方法是在读输入时就将子节点按照权重降序排序,然后之后直接D 阅读全文
posted @ 2022-05-11 22:49 带带绝缘体 阅读(36) 评论(0) 推荐(0)
摘要:这道题要求根据二叉树的后序遍历序列与中序遍历序列还原二叉树,并输出其层次遍历序列。 后序遍历序列是为了提供子树的根节点。对于一棵子树对应的后序遍历序列与中序遍历序列,后序遍历序列的最后一个元素就是子树的根节点。然后找到中序遍历序列中根节点的位置,它左部的子序列就是左子树的元素,右部的子序列就是右子树 阅读全文
posted @ 2022-05-10 19:59 带带绝缘体 阅读(46) 评论(0) 推荐(0)
摘要:给定一张 N 个点 M 条边的有向无环图,分别统计从每个点出发能够到达的点的数量。 输入格式 第一行两个整数 N,M,接下来 M 行每行两个整数 x,y,表示从 x 到 y 的一条有向边。 输出格式 输出共 N 行,表示每个点能够到达的点的数量。 数据范围 1≤N,M≤30000 输入样例: 10 阅读全文
posted @ 2022-05-04 18:01 带带绝缘体 阅读(42) 评论(0) 推荐(0)
摘要:看到结果可能取很大的值,就可以猜到要用DP。关键在于使用dp的话要按照什么顺序。题目使用的是有向图且食物链有先后顺序,所以联想到拓扑排序,使用拓扑排序得到拓扑序列,从而进行dp。dp[i]表示当前以i为结尾的食物链的条数(此时假设i没有出边)。假设节点i的后继是节点j,那么处理i的时候要对节点的出度 阅读全文
posted @ 2022-05-04 16:13 带带绝缘体 阅读(38) 评论(0) 推荐(0)
摘要:在一个热带雨林中生存着一群猴子,它们以树上的果子为生。 昨天下了一场大雨,现在雨过天晴,但整个雨林的地表还是被大水淹没着,部分植物的树冠露在水面上。 猴子不会游泳,但跳跃能力比较强,它们仍然可以在露出水面的不同树冠上来回穿梭,以找到喜欢吃的果实。 现在,在这个地区露出水面的有 N 棵树,假设每棵树本 阅读全文
posted @ 2022-05-02 17:12 带带绝缘体 阅读(41) 评论(0) 推荐(0)
摘要:题目: N 个城市,标号从 0 到 N−1,M 条道路,第 K 条道路(K 从 0 开始)的长度为 2K,求编号为 0 的城市到其他城市的最短距离。 输入格式 第一行两个正整数 N,M,表示有 N 个城市,M 条道路。 接下来 M 行两个整数,表示相连的两个城市的编号。 输出格式 N−1 行,表示 阅读全文
posted @ 2022-04-30 23:03 带带绝缘体 阅读(44) 评论(0) 推荐(0)
摘要:之前使用的是dijkstra算法,今天学习了BF和SPFA,故换个方法实现。 首先在SPFA算法处要注意:每次进行松弛边操作后,若松弛后更优,就要将边的另一个节点加入队列(先判断该节点是否已在队列中),并修改disTo数组和pathTo数组;若松弛后与松弛前的disTo值相等,则只补充pathTo数 阅读全文
posted @ 2022-04-28 20:32 带带绝缘体 阅读(37) 评论(0) 推荐(0)
摘要:思路:使用dijkstra+DFS的方法。首先要改造pathTo数组,使其每个元素都可以储存多个前驱节点的编号。在松弛节点时,若松弛后的值严格小于原来的disTo值,就要清空pathTo的对应元素,然后加入新的前驱节点编号;否则直接加入即可。 得到pathTo数组后,从汇点开始使用DFS反向向源点进 阅读全文
posted @ 2022-04-27 17:50 带带绝缘体 阅读(26) 评论(0) 推荐(0)
摘要:思路:这道题在基础dijkstra算法的基础上增加了两个新的标尺,即最短路径数和最短路径中点权和的最大值。由于这两个标尺比较简单,所以对dijkstra的松弛部分进行补充即可。使用两个数组pnum和wnum分别存储某个节点的当前最短路径数和最短路径中点权和的当前最大值,记得要对源点s的相应数据进行初 阅读全文
posted @ 2022-04-26 18:22 带带绝缘体 阅读(51) 评论(0) 推荐(0)
摘要:思路:该问题求最多转发层数内最多的转发人数,实际上就是从所要求的点进行BFS,然后计算限制层数内的节点数。 代码如下: #include <iostream> #include <vector> #include <queue> #include <cstdio> #include <string. 阅读全文
posted @ 2022-04-23 19:37 带带绝缘体 阅读(47) 评论(0) 推荐(0)
摘要:首先DISS一下devc,个byd玩意一调试就闪退,感谢你帮鼠鼠治疗低血压,还是VS2019好用啊。 巨坑:N为通话数,按照极端情况,最多会有2N个人,所以要把数组开到2N个元素,否则会挂一个测试样例(段错误)。读题一定要认真。 分析题目,不难看出要用到DFS来找连通分量,然后计算每个连通分量的边权 阅读全文
posted @ 2022-04-23 14:54 带带绝缘体 阅读(34) 评论(0) 推荐(0)