暑假集训 Nowcoder 多校 Round 4
F 「Election of the King」
签到题,每次淘汰的候选人要么是最左的,要么是最右的,因此用两个变量维护两端的索引,逐步向中间移动。
每一轮选举使用二分查找来得到两人的票数,将得票高的一方淘汰即可。
时间复杂度:\(O(nlogn)\)
空间复杂度:\(O(n)\)
每一轮循环也可以只看中间的人来判断谁被淘汰,可以将时间复杂度优化到 \(O(n)\)
1 |
|
L 「We are the Lights」
因为后续的操作会覆盖之前的操作,所以从后往前遍历所有操作,操作过的行和列会被锁住且后续无法再修改,同时用两个变量
r
、c
分别维护未被锁住的行数和列数,若当前操作为 row x on
且
x
行未上锁,则当前开灯总数增加 c
,r
自减 1,对于其他三种情况,同理分析即可。
时间复杂度:\(O(q)\)
空间复杂度:\(O(m + n + q)\)
1 |
|
J 「Qu'est-ce Que C'est?」
假设 \(dp[i][s]\) 表示 \([0, i]\) 序列中最小后缀和为 \(s\) 的合法情况有多少种,可以得到状态转移方程: \[ \begin{equation} dp[i][s] = \begin{cases} \ \sum_{k = s - m} ^ m dp[i - 1][k] & s \geq 0 \\ \\ \ \sum_{k = - s} ^ m dp[i - 1][k] & s < 0 \end{cases} \end{equation} \] 根据状态转移方程,我们需要定义一个后缀数组来维护后缀和来优化时间,同时注意到 \(dp[i]\) 只与 \(dp[i - 1]\) 有关,所以可以使用滚动数组优化空间。
时间复杂度:\(O(nm)\)
空间复杂度:\(O(m)\)
1 |
|
H 「Merge the squares!」
对于任意一个 \(n \times n\) 的正方形,如果 \(n < 8\) ,则可以一次性合并,若 \(n \geq 8\) ,我们考虑如下分割方式:
即将一个正方形分割为两个正方形与两个矩形,两个正方形的边长分别为 \(j\) 和 \(n - j\) ,通过枚举 \(j\) ,若两个 \((n - j) \times j\) 的矩形可以分割为不超过 24 个正方形,则总的正方形合并数不超过 50。经计算,发现对任意 \(n\) 满足 \(8 \leq n \leq 1000\) 都可以找到合法的 \(j\) 满足题意。
我们使用一个数组来维护每一个 \(n\) 的合法分割方案,然后使用递归来记录答案即可。
1 |
|