2 つの N ビットの数値 (0< N< 100000) があります。これらの数値に対して q 個のクエリ (0< q<500000) を実行する必要があります。クエリには、次の 3 つのタイプがあります。
set_a idx x: A[idx] を x に設定します。ここで、0 <= idx < N であり、A[idx] は A の idx 番目の最下位ビットです。
set_b idx x: B[idx] を x に設定します。ここで、0 <= idx < N です。
get_c idx: C[idx] を出力します。ここで、C=A+B、および 0<=idx です。
これで、できる限りコードを最適化しました。
まず、a、b、c の int 配列を試してみました。更新ごとに c を計算し、照会すると i 番目のビットを返します。めちゃくちゃ遅かった。4/11のテストケースのみクリア。
ブール配列の使用に移行しました。int 配列アプローチよりも約 2 倍高速でした。7/11 テストケースをクリアした。
次に、A+B の idx 番目のビットを計算するために c を計算する必要がないことがわかりました。a[i]=b[i]=0 または a[i]=b[i]=1 が見つかるまで、idx から右に向かって A と B をスキャンします。a[i]=b[i]=0 の場合、最初のキャリー = 0 から idx 番目のビットまで左に向かって加算します。そして、a[i]=b[i]=1 の場合、最初のキャリー = 1 から idx 番目のビットまで左に向かって加算します。これは高速でしたが、8/11 テストケースのみをクリアしました。
次に、私は一度考え出しました、私は位置i、a [i] = b [i] = 0またはa [i] = b [i] = 1に到達し、idx番目の位置に向かって合計する必要はありません。a[i]=b[i]=0 の場合、答えは (a[idx]+b[idx])%2 となり、a[i]=b[i]=1 の場合、答えは (a[ idx]+b[idx]+1)%2. 約 40% 高速化されましたが、それでも 8/11 のテストケースしかクリアできませんでした。
ここで私の質問は、これら 3 つの「難しい」テストケースをどのように解決するかということです。それらが何であるかはわかりませんが、プログラムは問題を解決するのに 3 秒以上かかります。
コードは次のとおりです。http://ideone.com/LopZf