私はscalaのcodechefからFlippingコインの問題を解決しようとしています。問題文は次のとおりです。Scalaを使ってコインを反転する
Nコインがありますが、0からNまで番号が付けられ、テーブルの上に保管 - Initally 1. 、各コインが尾を続けています。 操作の2つのタイプを実行する必要があります:1)AとBの間に番号が付けられたすべてのコインを反転します。これは、コマンド "0 A B"によって表される です。2)AとBの間の 番のコインこれは、コマンド "1 A B"によって表されます。入力:最初の行には2つの整数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 = Q < = 100000 0 < = A < = B < = N - 最も単純な方法で1
、私は次のようにScalaでintの配列を初期化することを考えた:
var coins = new Array[Int](1000)
Iコマンド0 ABが発生した場合、I私は、コマンド1 ABが発生した場合、私はB + 1までAから配列のスライスを取り、数をカウントします
for(i <- 5 until 8){
coins(i) = 1
}
次のように単にBまで+ 1にAのインデックスを設定します与えられたスライスと
val headCount = coins.slice(5,8).count(x => x == 1)
この操作は、最悪の場合にはO(n)を取ると、どうやらこれは対数時間で解決するように最適化することができるように思え:次のように私はそれを行います。
私はここで間違っているかもしれないし、この問題をどのようにして最適な方法で解決できるかを誰かが指摘することができます。これをモデル化する
ヘッドを見つけることができる間隔を格納する配列の代わりに。あなたの関数を実装する方法については、インターバルツリーのwiki記事を参照してください。 – ElKamina
@エルカミナ - ありがとう。おそらく、この特定の状況では、スカラーの区間木の実装が機能するでしょう。それについてもう少し詳しく読む必要があります。 –