最trivial的一集,都是比较简单的题目,但是代码编写很烦人。
B
题目大意:有 $n$ 家银行,每次转出只能转出 $x$ 元,同时转入到对方银行 $y$ 元,最后将所有钱汇聚到某家银行,它的最大值是多少?
数据范围: $2 \leq n \leq 2 \cdot 10^5, 1 \leq y \leq x \leq 10^9$ 。
思路:手玩样例可知,最后其他银行把钱全部转到某家银行即可,那么可流动资金是知道的,因此可以直接扣掉转入银行的流动资金,遍历 $O(n)$ 取最大值。
|
|
C
题目大意:给定 $k$ 个纸条,每个长度为 $n$ ,要求构造一个新的字符串 $s$ ,且 $s_j \in {ma[i][j],0 \leq i \leq k-1,0 \leq j \leq n-1 }$ ,使得 $s$ 的最小正周期最小。
数据范围: $2 \leq n,k \leq 50000,4 \leq n \cdot k \leq 10^5$
思路:看到最小正周期,很trivial的一个思路就是枚举它的最小正周期,时间复杂度为 $O(\sqrt{n})$ 。
然后再跑一遍 $O(n)$ 的遍历,由于状态只有 $26$ ,因此可以考虑使用状压求集合交,类似一个分组循环的形式,时间复杂度为 $O(n \sqrt{n})$ 。
|
|
D
题目大意:在一个 $n \times m$ 的0-1网格上,请从左上到右下划一刀,刀口只能向右或者向下,请使得切割后两部分的1数量乘积最大,并输出刀口。
数据范围: $1 \leq n,m \leq 3 \cdot 10^5,2 \leq n \cdot m \leq 3 \cdot 10^5$ 。
思路:首先第一反应肯定是两部分都切到总数的 $\frac{1}{2}$ ,但是一定能这么切吗?
烧烤一下,其实贪心一下可以这么切,也就是首先第一块将所有的都切到,然后刀口直接往下调整即可,这也是记录方案的方法。
|
|
E
题目大意:在一个 $n \times m$ 的网格上,Bob可以将某个格子的数取相反数,问Alice从左上角到右下角的路径,至少的路径总和是多少,其中Alice会在Bob操作后按照最优情况行动。
数据范围: $1 \leq n,m \leq 10^6,1 \leq n \cdot m \leq 10^6, -10^9 \leq a_{i,j} \leq 10^9$
思路:肯定是网格图DP,再往下看,不难发现Bob如果要反转一个格子,那么肯定是翻转最优路径上的格子。
于是出现两种情况,一种是直接按照原来路径踩着翻转的格子过去,一种是绕过去。
前者的计算不难,绕过去怎么计算?假设翻转的格子是 $(x,y)$ ,则绕过去的格子必然经过 $(a,b),$ 其中 $a>x,b<y$ 或者 $a<x,b>y$ ,然后就变为前后缀分解问题了,可以使用二维前缀最大值将查询复杂度降为 $O(1)$ ,总时间复杂度为 $O(n \cdot m)$ 。
同时,由上文的讲解,这道题还需要还原路径,因为需要从被翻转的点上做文章。
|
|