刷刷蓝书
文章平均质量分 77
Brightess
湖南城市学院在读,大四学生
展开
-
AcWing 240. 食物链(边带权并查集 维护节点至父节点的距离)
动物王国中有三类动物 A,B,C,这三类动物的食物链构成了有趣的环形。A 吃 B,B 吃 C,C 吃 A。现有 N 个动物,以 1 - N 编号。每个动物都是 A,B,C 中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这 N 个动物所构成的食物链关系进行描述:此人对 N 个动物,用上述两种说法,一句接一句地说出 K 句话,这 K 句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。你的任务是根据给定的 N 和 K 句话,输出假话的总数。第一行两个整数,N,K,表原创 2022-06-19 01:40:09 · 251 阅读 · 0 评论 -
AcWing 149. 荷马史诗(“打补丁” 填充 k 叉哈夫曼树 贪心求最深节点深度最小值)
类似于 合并果子,但是 合并果子 是 每次合并 堆( 叉哈夫曼树),而本题是 每次最多合并 堆。( 叉哈夫曼树)共有两问:首先我们分析 哈夫曼树 的一个经典性质:但是如果按上面的性质,面对下面的情况中会存在一些问题:假设一棵哈夫曼树 共有 个节点,每次合并 个节点,造成的影响是 总节点数每次少 。当 最后一次合并的时候,我们只会 合并 堆,稍作思考,下面这棵树显然不是最优的 原因:这棵树 最高处只有 叉,我们其实可以 将其下方任意一个节点取下来并作为最高处节点的子节点。这样 代价一定会变的更小原创 2022-06-14 10:24:26 · 182 阅读 · 0 评论 -
AcWing 146. 序列(优先队列 + n 路归并 + 分组法)
给定 个长度为 的序列,从 每个序列 中 任取一个数 求和,可以构成 个和,求其中 最小的 个和。 ()对于本题,我们可以转化为:将 个序列进行合并成 个序列。我们可以 分为两步进行处理。对于 第一步,我们发现,如果直接将 个序列合并成 个序列 不太好做,一个 常用的思想 是:每次将两个序列合并成一个,这样一来,合并 次即可。( 路归并)先处理前两个序列,我们 从每个序列都挑一个数,一共有 种可能产生的和,我们 只保留前 小的和(因为我们最终要求的是 最小的 个和,因此 之后的都没原创 2022-06-13 13:47:45 · 107 阅读 · 0 评论 -
AcWing 137. 雪花雪花雪花(数组模拟哈希表)
有 片雪花,每片雪花 由六个角组成,每个角都有长度。第 片雪花 六个角的长度 从某个角开始顺时针依次记为 。因为雪花的形状是封闭的环形,所以 从任何一个角开始顺时针或逆时针往后记录长度,得到的六元组都代表形状相同的雪花。例如: 和 就是形状相同的雪花。 和 也是形状相同的雪花。我们定义 两片雪花形状相同,当且仅当它们 各自从某一个角开始顺时针或逆时针记录长度,能得到两个相同的六元组。求 这 片雪花中 是否存在 两片形状相同 的雪花。观察数据范围,我们应该将复杂度控制在 或 的范围内,这里我们使原创 2022-06-12 22:23:59 · 505 阅读 · 0 评论 -
AcWing 135. 最大子序和(前缀和 + 单调队列求定长区间最小值)
前置知识:单调队列求滑动窗口最小值给定一个 长度为 的整数序列(可能有 负数),从中 找出一段长度不超过 的连续子序列,使得 子序列中所有数的和 最大。根据我们的经验,计算 “区间和” 的问题,一般转化为 “两个前缀和相减” 的形式进行求解。先求出 表示序列里前 项的和,则 连续子序列 中数的和 就等于 。那么 原问题可以转化为:找出 两个位置 ,使 最大,并且 。既然将 前缀和数组 都求出来了,那么就很好办了:枚举区间的 右端点 :从 开始,依次从前往后枚举到 。对于 每一个右端点,固定原创 2022-06-11 17:04:04 · 204 阅读 · 0 评论 -
AcWing 132. 小组队列(队列模拟题)
有 个小组 要进行排队,每个小组中有若干个人。当一个人来到队伍时,给定 不超过 个入队指令(编号为 的人 来到队伍)和 出队指令(队头的人 出队),输出 出队的顺序。这题显然需要用到很多 小队列,因此为了方便,我们先直接开 个 作为 总队列,即 用一个 哈希表 ,记录 所有输入的成员编号 所属的 小组编号。用一个 数组 ,记录 输入成员所属的小组 是否出现在 总的队列 中,如果 为 则未出现过,不为 则同时记录 该小组 出现在 第几段 小队列 之中。之后就是模拟,具体详见代码。注意:...原创 2022-06-11 13:59:13 · 192 阅读 · 0 评论 -
AcWing 131. 直方图中最大的矩形(单调栈经典运用 模板)
前置知识:单调栈给定很多柱形图, 每个柱形 宽度均为 。所有柱形紧挨在一起。我们知道 所有柱形的高度 。求包含于这些柱形的并集内部的最大矩形的面积(在下图中,答案就是阴影部分的面积),柱形个数 。首先考虑暴力做法,以每个矩形的高度为准,向两边扩展,直到遇到比它矮的为止 如图所示,每个矩形 向两侧扩展,显然 当 向左扩展 到 第一个比当前高度严格小的矩形位置 时停止,向右同理扩展至 (这不就是单调栈的经典运用吗)扩展出的矩形面积为 最优解会在这些扩展出的矩形中产生。(暴力做法 )单调栈优化在计算每个矩形可原创 2022-06-11 02:11:09 · 143 阅读 · 0 评论 -
AcWing 128. 编辑器(对顶栈 实现序列内部指定位置高效修改)
我们用这道题引入一个新的概念:对顶栈。(类似的,还有 对顶堆,日后我们会谈到)本题的特殊点在于: 四种操作 都在 光标位置处 发生,并且操作完成后,光标至多移动 个位置。根据这种 “始终在 序列中间某个指定位置 进行 修改” 的性质,我们想到了 “对顶栈” 。建立两个栈:栈 存储 从 序列开头 到 当前光标位置 的这一段子序列。栈 存储 从 当前光标位置 到 序列结尾 的这一段子序列。二者都以光标所在的那一端作为栈顶。这两个栈合起来就保存了整个序列。因为 查询操作的 不超过光标位置,所以我们用一个原创 2022-06-10 15:42:32 · 259 阅读 · 0 评论 -
AcWing 41. 包含min函数的栈(单调栈)
题目要求在 的时间内实现题中所述的所有操作。为了以 的时间复杂度 实现 操作,我们还需要维护另外一个辅助栈 (单调栈),栈 中存储的是 原栈 中以栈底开头的每段数据的最小值,其中的元素具有 单调性。那么如何维护 单调栈 呢, :当我们向栈中 压入 一个数时,如果 该数 单调栈的栈顶元素,则将该数 同时压入单调栈中;否则,不压入,这是由于栈具有 先进后出 性质,所以:在该数 被弹出之前,栈中 一直存在一个数比该数小,所以 该数一定不会被当做最小数 输出。 :当我们从栈中 弹出 一个数时,如果 该数原创 2022-06-10 11:06:50 · 108 阅读 · 0 评论