【发布时间】:2012-05-11 06:17:31
【问题描述】:
我正在尝试解决 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
以最简单的方式,我正在考虑在 scala 中初始化一个 Ints 数组,如下所示:
var coins = new Array[Int](1000)
如果遇到命令0 A B,我会简单的设置A的索引直到B+1为1,如下:
for(i <- 5 until 8){
coins(i) = 1
}
如果我遇到命令 1 A B,我将从 A 到 B+1 取出数组的一个切片,并计算给定切片中 1 的数量,我将按如下方式执行:
val headCount = coins.slice(5,8).count(x => x == 1)
似乎这个操作在最坏的情况下需要 O(n),显然这可以优化以在对数时间内解决。
谁能指出我在这里可能做错了什么以及如何以最佳方式解决这个问题。
谢谢
【问题讨论】:
-
而不是数组来存储可以找到磁头的间隔。请参阅区间树 wiki 文章,了解如何实现函数。
-
@Elkamina - 谢谢。也许在这种特殊情况下,scala 中的区间树实现会起作用。需要阅读更多内容。
标签: algorithm scala optimization data-structures iteration