本题解包含ABC228的所有题目。
ABC228 A - On and Off
一个人每天在
分析:
本题主要难点在于
那么当
但是这个时候就会遇到一个问题:如果原来有
在操作完之后就会有
那么如果这个时候有
最后只需要看是否有
注意题目中问的是
代码:
1 |
|
ABC228 B - Takahashi's Secret
高桥有
有一天,高桥不小心人让 Friend
如果第
求最后有多少人会知道高桥的秘密。
分析:
直接按照题意,模拟每个朋友知道这个秘密的顺序。
最后一遍模拟一遍计算答案即可。
因为每个朋友最多知道这个秘密一次,所以时间复杂度为
代码:
1 |
|
ABC228 C - Final Day
现在有
每天考试的满分均为
目前前三天的考试已经完成了,第
对于每个学生,请确定他是否有可能在第四天考试后排名在前
注:第四天之后的学生排名定义为四天总成绩高于该学生的学生人数再加1。
显然,当其他学生第四天考试成绩一直的情况下,某个学生第四天成绩越好,排名就越靠前。
所以当某个学生第
对于每一个学生,我们只需要检查这个排名与
排序即可,时间复杂度为
代码:
1 |
|
ABC228 D - Linear Probing
有一个序列
现在有
当
当
存在至少一个
由于每一次只会更改一个地方的值,我们考虑维护这个序列。
现在的目标是快速找到某一个位置以后第一个为
我们可以使用一个并查集,在初始的时候并查集每一个元素都指向自己。
在我们更改一个位置的值以后,将这个位置向它下一个位置合并过去。
这样子每一次从一个地方开始 find()
到的元素就是题目中要找的位置了。
查询的时候直接输出就可以了。
时间复杂度
代码:
1 |
|
ABC228 E - Integer Sequence Fair
现在有许多个长度为
你现在要给每一个整数序列打分,分数是一个属于
请问共有多少种不同的打分方案。(当有任何一个序列在两种方案中得到的分数不同时,这两个方案不同)
分析:显然,不同的序列共有
所以答案为
注:指数向
时间复杂度
代码:
1 |
|
ABC228 F - Stamp Game
现在有一个
从上面数第
一开始的时候这些格子都是白色的。
现在又两个人,他们要进行一下操作:
第一个人选一个高为
,宽为 的矩阵,并将这里的所有数字都涂黑。 第二个人在第一个人涂完后,选择一个高为
,宽为 的矩阵,并将这里的所有数字涂白。
如果一个格子先被涂黑,再被涂白,那么这个格子最终是白色的。(意思就是每个格子最后的颜色取决于最后一次涂上了什么色,如果没有涂色那它就是白的)
第一个人想要让黑色的方格里数字之和最大化,第二个人想要让黑色的方格里数字之和最小化。
求最后这个黑色方格里面的数字之和是多少。
分析:首先我们可以令
因为第二个人知道第一个人将哪些格子涂黑了,所以当
接下来我们不妨来枚举一下第一个人选的方格是哪一个。
这一步显然是
我们可以提前预处理出前缀和,这样我们就可以快速求得第一个人选择的方块中的数字之和。
那么如果第一个人已经确定了要选这个矩阵,第二个人会选哪一个矩阵呢?
用脑子稍微想一下你会发现,他选的一定是和最大的那一个。
这不就好办了。
我们提前预处理出第二个人选每一个矩阵能够减少的贡献是多少。
然后枚举第一个人选的是哪一个矩阵,然后利用某些东西求出第二个人选的是哪一个矩阵,最后答案取最大值,不就可以了吗?
那我们用什么东西来维护第二个人选择哪个矩阵呢?
我们其实需要一个可以快速得到某一个二维区间(就是一个矩阵)中数字的最小值的东西。
直接二维线段树/二维st表搞定。
时间复杂度为
代码里用的是二维线段树。
代码:
1 |
|
ABC228 G - Digits on Grid
现在有一个
一开始的时候有一个棋子在这个网格上,并且还有一个数字
你现在要做以下操作
将这个棋子移到同行的任何一个格子上(可以不移)。
将现在棋子所在方格上面的数字添加在
的末尾。 将这个棋子移到同列的任何一个格子上(可以不移)。
将现在棋子所在方格上面的数字添加在
的末尾。
这个棋子一开始可以在任何一个位置,求最后
注:如果有多种方法使得
分析:
不得不说,这是一道神仙题。
首先我们将题意进行转化:
现在有一个二分图,左边有
个点,右边有 个点。
左边的每一个点与右边的每一个点都有连边,其中左边的第
个点与右边的第 个点之间的边有边权 。
现在有一个棋子在左边的任何一个点上,现在棋子要在这个图上沿着走
步,每走一步就要将走过边上的边权加到 的末尾,求 最后有多少可能的取值。
不难发现,这个问题和刚刚问题的答案是一样的。
再联系到
我们不妨先令
然后你就会发现这种玩意会算重。
那么我们能不能去一下重呢?
于是乎,就有一个神奇的状压 dp 出现了:
令
举个例子,假如现在已经走过了
最后对
时间复杂度
代码:
1 |
|
ABC228 H - Histogram
现在有两个长度为
你现在可以进行以下操作任意多次(不进行也可以):
选择一个
使得 。 花费
的代价使得 。
最终的序列也有一个成本为
其中
问最小的代价是多少。
代价为进行操作的代价加上最后序列的成本。
分析:
不得不说,这还是一道神仙题。
首先我们将这两个序列进行排序,使得
为了方便,我们令
因为我们已经将
单调不降
为什么呢?
假设存在两个下标
因为我们之前排了序,所以还会有
那么这种情况显然不是最优的。
如果我们令
所以这是正确的。
那么一定就会存在两个序列
这个也很好理解,因为
然后呢?
然后 dp 呀。
我们设
那么
就会有
然后你就可以快乐的
然后
考虑优化转移。
令
假设
有没有发现哪里不对?
这个玩意可以斜率优化!
令
那么就有
直接一个二分+斜优就可以了。
时间复杂度
注:事实上那个
代码:
1 |
|
完结撒花!