算法竞赛进阶指南
文章平均质量分 73
暑假集训刷题记录
zzqwtc
blog dot zzqwtc dot com
展开
-
Acwing 378.骑士放置(二分图的最大独立集)
Acwing 378.骑士放置题意给定一个 N×M 的棋盘,有一些格子禁止放棋子。问棋盘上最多能放多少个不能互相攻击的骑士(国际象棋的“骑士”,类似于中国象棋的“马”,按照“日”字攻击,但没有中国象棋“别马腿”的规则)。思路将棋盘划分为两类:坐标和奇数为一类 坐标和偶数为一类,如下图可以发现 当前格子能到达的格子与其本身奇偶性不同,所以根据坐标和的奇偶性将其抽象成一个二分图,把每个格子和它能到达的格子之间连一条边。题目要求出最多能放置多少个不能互相攻击的骑士,也即求出最多能放置多少个骑士其两原创 2021-10-07 16:04:34 · 3405 阅读 · 0 评论 -
Acwing 376.机器任务 (最小点覆盖)
Acwing 376.机器任务题意有两台机器 AAA,BBB 以及 KKK 个任务。机器 AAA 有 NNN 种不同的模式(模式0∼N−10∼N−10∼N−1),机器 BBB 有 MMM 种不同的模式(模式 0∼M−10∼M−10∼M−1)。两台机器最开始都处于模式 0。每个任务既可以在 AAA 上执行,也可以在 BBB 上执行。对于每个任务 iii,给定两个整数 a[i]a[i]a[i] 和 b[i]b[i]b[i],表示如果该任务在 AAA 上执行,需要设置模式为 a[i]a[i]a[i],原创 2021-10-07 15:00:22 · 3277 阅读 · 0 评论 -
超市 (0x15 二叉堆)
超市题意超市里有 N 件商品,每件商品都有利润 pip_ipi 和过期时间 did_idi,每天只能卖一件商品,过期商品不能再卖。求合理安排每天卖的商品的情况下,可以得到的最大收益是多少。思路首先将所有商品按照过期时间非严格单调递增排序,然后遍历每一件商品。将 S 定义为已经选择要卖的商品的集合,如果将当前遍历到的商品 node[i] 加入集合后,集合的大小小于等于 node[i]的过期时间 did_idi 那么符合继续遍历接下来的商品。否则,将当前集合中价值最小的商品移除,直到与 did_原创 2021-08-26 20:42:14 · 3486 阅读 · 2 评论 -
后缀数组 (0x14 hash)
后缀数组题意后缀数组 (SA) 是一种重要的数据结构,通常使用倍增或者 DC3 算法实现,这超出了我们的讨论范围。在本题中,我们希望使用快排、Hash 与二分实现一个简单的 O(nlog2n)O(nlog2n)O(nlog2n) 的后缀数组求法。详细地说,给定一个长度为 n 的字符串 S(下标 0∼n−1),我们可以用整数 k(0≤k<n) 表示字符串 S 的后缀 S(k∼n−1)。把字符串 S 的所有后缀按照字典序排列,排名为 i 的后缀记为 SA[i]。额外地,我们考虑排名为 i 的后原创 2021-08-25 15:31:57 · 3312 阅读 · 0 评论 -
邻值查找(0x13 链表与邻接表)
邻值查找题意给定一个长度为 nnn 的序列 AAA,AAA 中的数各不相同。对于 AAA 中的每一个数 AiA_iAi,求:min1≤j<i∣Ai−Aj∣min_{1≤j<i}|A_i−A_j|min1≤j<i∣Ai−Aj∣以及令上式取到最小值的 jjj(记为 PiP_iPi)。若最小值点不唯一,则选择使 AjA_jAj 较小的那个。思路将原数组按照权值递增排序后,构造成一个链表,然后按照输入顺序从后往前计算结果,每算出一个数 AiA_iAi的结果后,就将其从链原创 2021-08-18 00:15:01 · 3429 阅读 · 0 评论 -
士兵(0x05 排序)
士兵题意格格兰郡的 N 名士兵随机散落在全郡各地。格格兰郡中的位置由一对 (x,y) 整数坐标表示。士兵可以进行移动,每次移动,一名士兵可以向上,向下,向左或向右移动一个单位(因此,他的 x 或 y 坐标也将加 1 或减 1)。现在希望通过移动士兵,使得所有士兵彼此相邻的处于同一条水平线内,即所有士兵的 y 坐标相同并且 x 坐标相邻。请你计算满足要求的情况下,所有士兵的总移动次数最少是多少。需注意,两个或多个士兵不能占据同一个位置。思路首先我们可以想到,士兵在 x 轴上的移动和在 y 轴原创 2021-08-05 17:58:32 · 3321 阅读 · 0 评论 -
给树染色(0x07 贪心)
给树染色题意一颗树有 n 个节点,这些节点被标号为:1,2,3…n,每个节点 ii 都有一个权值 A[i]。现在要把这棵树的节点全部染色,染色的规则是:根节点 R 可以随时被染色;对于其他节点,在被染色之前它的父亲节点必须已经染上了色。每次染色的代价为 T×A[i],其中 TT 代表当前是第几次染色。求把这棵树染色的最小总代价。思路比较容易想到的贪心思路为,每次找到还未染色的权值最大的节点进行染色。但是对于这样的一棵树:有一个节点的权值较小,但是它的子节点权值都非常大,另一个节点的权值较大,原创 2021-08-03 21:59:33 · 4241 阅读 · 0 评论 -
畜栏预定(0x07 贪心)
畜栏预定题意有 N 头牛在畜栏中吃草。每个畜栏在同一时间段只能提供给一头牛吃草,所以可能会需要多个畜栏。给定 N 头牛和每头牛开始吃草的时间 A 以及结束吃草的时间 B,每头牛在 [A,B] 这一时间段内都会一直吃草。当两头牛的吃草区间存在交集时(包括端点),这两头牛不能被安排在同一个畜栏吃草。求需要的最小畜栏数目和每头牛对应的畜栏方案。思路将问题转换为,将一些区间分配到一些数轴上,同一数轴上的任意两个区间没有交集,问最少需要多少个数轴。将区间按左端点升序排序,同时用一个优先队列(小根堆)原创 2021-07-29 18:05:57 · 3434 阅读 · 0 评论 -
防晒(0x07 贪心)
防晒题意有 C 头奶牛进行日光浴,第 i 头奶牛需要 minSPF[i] 到 maxSPF[i] 单位强度之间的阳光。每头奶牛在日光浴前必须涂防晒霜,防晒霜有 L 种,涂上第 i 种之后,身体接收到的阳光强度就会稳定为 SPF[i],第 i 种防晒霜有 cover[i] 瓶。求最多可以满足多少头奶牛进行日光浴。思路刚拿到这题的时候,我也不知道应该按什么顺序排序,但是我知道要么是按照 minSPF递增排序,要么是按照 maxSPF 递减排序。那么我们假设按照 maxSPF 递增排序。如下图,有两原创 2021-07-29 17:55:05 · 3421 阅读 · 0 评论 -
电影(0x05 排序)
电影题意莫斯科正在举办一个大型国际会议,有 n 个来自不同国家的科学家参会。每个科学家都只懂得一种语言。为了方便起见,我们把世界上的所有语言用 1 到 109 之间的整数编号。在会议结束后,所有的科学家决定一起去看场电影放松一下。他们去的电影院里一共有 m 部电影正在上映,每部电影的语音和字幕都采用不同的语言。对于观影的科学家来说,如果能听懂电影的语音,他就会很开心;如果能看懂字幕,他就会比较开心;如果全都不懂,他就会不开心。现在科学家们决定大家看同一场电影。请你帮忙选择一部电影,可以让观原创 2021-07-28 00:38:43 · 3348 阅读 · 0 评论 -
最佳牛围栏(0x04 二分)
最佳牛围栏题意农夫约翰的农场由 N 块田地组成,每块地里都有一定数量的牛,其数量不会少于 1 头,也不会超过 2000 头。约翰希望用围栏将一部分连续的田地围起来,并使得围起来的区域内每块地包含的牛的数量的平均值达到最大。围起区域内至少需要包含 F 块地,其中 F 会在输入中给出。在给定条件下,计算围起区域内每块地包含的牛的数量的平均值可能的最大值是多少。思路原题意为:求一个平均数最大的,长度不小于 F 的连续子段二分答案,判断是否存在一个长度不小于 F 的子段,其平均值不小于二分的值若将原创 2021-07-27 00:55:05 · 3469 阅读 · 0 评论 -
分形之城(0x02 递推与递归)
分形之城题意城市的规划在城市建设中是个大问题。不幸的是,很多城市在开始建设的时候并没有很好的规划,城市规模扩大之后规划不合理的问题就开始显现。而这座名为 Fractal 的城市设想了这样的一个规划方案,如下图所示:当城区规模扩大之后,Fractal 的解决方案是把和原来城区结构一样的区域按照图中的方式建设在城市周围,提升城市的等级。对于任意等级的城市,我们把正方形街区从左上角开始按照道路标号。虽然这个方案很烂,Fractal 规划部门的人员还是想知道,如果城市发展到了等级 N,编号为 A 和原创 2021-07-25 16:47:57 · 3542 阅读 · 0 评论 -
起床困难综合症(0x01位运算)
起床困难综合症题意drd 的防御战线由 n 扇防御门组成。每扇防御门包括一个运算 op 和一个参数 t,其中运算一定是 OR,XOR,AND 中的一种,参数则一定为非负整数。如果还未通过防御门时攻击力为 x,则其通过这扇防御门后攻击力将变为 x op t。最终 drd 受到的伤害为对方初始攻击力 x 依次经过所有 n 扇防御门后转变得到的攻击力。由于 atm 水平有限,他的初始攻击力只能为 0 到 m 之间的一个整数(即他的初始攻击力只能在 0,1,…,m 中任选,但在通过防御门之后的攻击力不受原创 2021-07-23 14:00:52 · 3325 阅读 · 0 评论 -
最短Hamilton路径(0x01 位运算)
最短Hamilton路径题意给定一张 n 个点的带权无向图,点从 0∼n−1 标号,求起点 0 到终点 n−1 的最短 Hamilton 路径。Hamilton 路径的定义是从 0 到 n−1 不重不漏地经过每个点恰好一次。思路:将每个点的状态用一个二进制整数 i 表示,i的第 k 位为 1 表示经过了第 k 个点,否则表示还没经过第 k 个点然后用 j 表示当前状态下最后一个经过的点的编号,f[i][j] 表示 当前经过的点的状态为 i 最后一个经过的点为 j 的最短路径那么我们要求的就是原创 2021-07-22 23:27:36 · 3361 阅读 · 0 评论