私はscalaのcodechefからのフリッピングコインの問題を解決しようとしています。問題の説明は次のとおりです。
テーブルには0からN-1までの番号が付けられたN枚のコインがあります。最初は、各コインはテールアップで保持されます。2種類の操作を実行する必要があります:1)AとBの間に番号が付けられたすべてのコインを裏返します。これはコマンド「0A B」で表されます。2)AとBの間に番号が付けられたコインの数に答えます。これは、コマンド「1AB」で表されます。入力:最初の行には、NとQの2つの整数が含まれています。次のQ行はそれぞれ、上記のように「0AB」または「1AB」のいずれかの形式です。
出力:対応するクエリに必要な回答を含む「1AB」形式のクエリごとに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でIntの配列を初期化することを考えていました。
var coins = new Array[Int](1000)
コマンド0ABに遭遇した場合、次のようにB+1が1になるまでAのインデックスを設定します。
for(i <- 5 until 8){
coins(i) = 1
}
コマンド1ABに遭遇した場合、AからB + 1までの配列のスライスを取得し、その特定のスライス内の1の数をカウントし、次のように実行します。
val headCount = coins.slice(5,8).count(x => x == 1)
この操作は最悪の場合O(n)を取るようであり、明らかにこれは対数時間で解くように最適化することができます。
誰かが私がここで間違っているかもしれないことを指摘できますか、そしてこの問題を最適な方法でどのように解決できますか?
ありがとう