我正在尝试解决 scala 中 codechef 的翻转硬币问题。问题陈述如下:
桌上有 N 个硬币,编号从 0 到 N - 1。最初,每个硬币都是反面朝上的。您必须执行两种类型的操作: 1) 翻转编号在 A 和 B 之间的所有硬币。这由命令“0 A B”表示 2) 回答编号在 A 和 B 之间的硬币有多少是正面朝上的。这由命令“1 A B”表示。输入:第一行包含两个整数,N 和 Q。接下来的 Q 行中的每一行都是上面提到的“0 A B”或“1 A B”的形式。
输出:为“1 A B”形式的每个查询输出 1 行,其中包含相应查询所需的答案。
样本输入:
4 7
1 0 3
0 1 2
1 0 1
1 0 0
0 0 3
1 0 3
1 3 3
样本输出:
0
1
0
2
1
约束:1 <= N <= 100000 1 <= Q <= 100000 0 <= A <= B <= N - 1
以最简单的方式,我正在考虑在 scala 中初始化一个 Ints 数组,如下所示:
var coins = new Array[Int](1000)
如果我遇到命令 0 AB,我将简单地将 A 的索引设置为直到 B+1 为 1,如下所示:
for(i <- 5 until 8){
coins(i) = 1
}
如果我遇到命令 1 AB,我将从 A 到 B+1 取出数组的一个切片,并计算给定切片中 1 的数量,我将按如下方式执行:
val headCount = coins.slice(5,8).count(x => x == 1)
看起来这个操作在最坏的情况下需要 O(n) ,显然这可以优化为在对数时间内解决。
有人可以指出我在这里可能做错了什么以及如何以最佳方式解决这个问题。
谢谢