HDU.6186.CSCource。(接頭辞と接尾辞配列の配列)

  明日はレース南昌は、訓練を受けた訓練を受け、訓練を受け、これらの日は、最初のトピックに毎日更新されていない、と後に訓練を受け、訓練を受け、質問にアップ研修を受けた後の日です。

今日とチームメイトは少し腫れ5つの質問はまだ、広西チワン族自治区で2017年大会をしました......

  さて、最初の興味深いトピックのためにそれを見て......

CSコース

制限時間:2000分の4000 MS(Javaの/その他)メモリの制限:32768分の32768 K(Javaの/その他)
の合計提出(S):3450受理提出(S):1287


問題の説明
リトルAは大学に来て、コンピュータ科学を専攻しています。

今日の彼は、アルゴリズムのレッスンで、ビット操作を学習している、と彼は宿題として問題を得ました。

ここでは、問題となっている:

あなたは、非負整数nは与えている  1 2 nは、および一部のクエリ。クエリだけが意味正の整数p、含まれている  以外のすべての整数のビット演算(AND、OR、XOR)の結果答えるように頼まれ  たpを



 

 

入力
せいぜい15のテストケースはありません。 

各テストケースは、2つの正の整数nおよびpで始まる
行は、正の整数の数とクエリの数を示します。

2 N Q 10 5

そしてnは負でない整数  1 2 nは  ラインで次、  0 iが10 9  私は、範囲[1、N]で毎。その後qは正の整数であり  、P 1 P 2

p個のQ Q線における 1つの≤のPiがnは 範囲[1、Q]の各iについては。
 

 

出力
各クエリpに対して、出力3つの非負の整数を除くすべての非負整数のビット演算(AND、OR、XOR)の結果を示し  、P  線です。
 

 

サンプル入力
3 3 1 1 1 1 2 3
 

 

サンプル出力
1 1 0 1 1 0 1 1 0
 

 

ソース
 

 

推薦します
liuyiding | 我々は慎重にあなたのためのいくつかの同様の問題を選択している:   6543   6542   6541   6540   6539 
 
この質問のアイデア:私は、X ^ Y = zの場合には、その後、yはzの^ xで得ることができている、あなたは操作に対して^来ることができ、暴力から出てくるし始め、タイムアウトの結果、後に彼のチームメイトを、ビットを議論します&と|私たちはすべてのオカレンス0と1の数を配置することを予定してから、対応する数字上のデジタル数字の0と1を削除するとき、削除、裁判官&と|することができます。その後、しかし、接頭辞と接尾辞配列のアレイと、これを実現達成するために、その後、ブログのレコードを書くために最初のうち、今日のように、思考の問題のこのタイプを行うには初めてのライン上の適切なビット操作をしません。
参照コード:
書式#include <cstdioを>
 使用して 名前空間はstdを、

const  int型 MAXN = 100000 + 5 INT ; MAXN] C、[MAXN] _and1、[MAXN] _and2、[MAXN] _or1、[MAXN] _or2、[MAXN] _xor1、[MAXN] _xor2 

INT のmain(){
     int型N、P、Q、ANS1、ANS2、ANS3。
    一方、(〜のscanf(" %D%dの"、&​​N&P)){
         ためint型 i = 1 ; iが<= N; iが++ ){ 
            scanf関数(" %のD "、&C [I])。
        } 
        _and1 [ 1] = _or1 [ 1 ] = _xor1 [ 1 ] = Cを[ 1 ]。
        _and2 [N] = _or2 [N] = _xor2 [N] =のC [N]。
        以下のためにint型 I = 2 ; iが<= N; iは++ ){ 
            _and1 [I] = _and1 [I - 1 ]とC [i]は、
            _or1 [I] = _or1 [I - 1 ] | C [i]は、
            _xor1 [I] = _xor1 [I - 1 ] ^ Cの[I]。
        } 
        のためのint型 I = N - 1 ; I> = 1 - I、){
            [I] _and2を = _and2 [I + 1 ]とC [i]は、
            _or2 [I] = _or2 [I + 1 ] | C [i]は、
            _xor2 [I] = _xor2 [I + 1 ] ^ C [i]は、
        } 
        
        のためにint型 i = 0 ; iは、Pを<; iは++ ){ 
            scanf関数(" %のD "、&q)を。
            もし(Qの== 1 ){ 
                ANS1 = _and2 [ 2 ]。
                ANS2 = _or2 [ 2 ]。
                ANS3= _xor2 [ 2 ]。            
            } そう であれば(Q == N){ 
                ANS1 = _and1 [N - 1 ]。
                ANS2 = _or1 [N - 1 ]。
                ANS3 = _xor2 [N - 1 ]。
            } { 
                ANS1 = _and1 [Q - 1 ]&_and2 [Q + 1 ]。
                ANS2 = _or1 [Q - 1 ] | _or2 [Q + 1 ]。
                ANS3 = _xor1 [Q - 1 ] ^ _xor2 [Q + 1 ]。
            } 
            のprintf(" %D%D%D \ n " 、ANS1、ANS2、ANS3)。
        } 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/bianjunting/p/10958255.html