整数配列(最大サイズ50000)指定された、Iは最小値と最大見つけなければならない例えば一部について、と。X = P ⊕ P + 1 ⊕ ⋯ ⊕ A Q P Q P ≤ Q
私はこのプロセスを試しました: for all。私はそれをで事前に計算し、次にいくつかの、の値を計算しては次のようになり:。したがって: I O (N )X P Q (P ≤ Q )X = 和Q ⊕ 和P - 1
しかし、このプロセスはです。どうすればもっと効率的にできますか?
整数配列(最大サイズ50000)指定された、Iは最小値と最大見つけなければならない例えば一部について、と。X = P ⊕ P + 1 ⊕ ⋯ ⊕ A Q P Q P ≤ Q
私はこのプロセスを試しました: for all。私はそれをで事前に計算し、次にいくつかの、の値を計算しては次のようになり:。したがって: I O (N )X P Q (P ≤ Q )X = 和Q ⊕ 和P - 1
しかし、このプロセスはです。どうすればもっと効率的にできますか?
回答:
場合は整数のビットサイズである、あなたはMaxで計算することができます時間。
基本的に、問題は、、ビットの整数与えられた、が最大になるような見つけることです。
各をバイナリ文字列として扱い(バイナリ表現を見て)、それらの文字列からトライを作成します。これには時間かかります。
ここで、各、作成したトライでの補数を歩いて(基本的に各ステップで最良の分岐をとる)、が最大になるような見つけます。
これをごとに実行すると、時間で答えがわかります。
整数が制限されているため、このmaxのアルゴリズムは基本的に線形であり、minのアルゴリズムも並べ替えによって得られます(並べ替えは線形時間で実行できるため)。
ちなみに、境界がない場合は、要素の明瞭度を最小バージョンに減らすことができます。
ソートはも役立ちます。少なくとも、少なくとも。明らかに、最大値はによって到達されます。したがって、各に対して、バイナリ検索を実行します。これはソートと同じ時間なので、手順全体の複雑さは変わりません。