Codeforcesラウンド#618(本部2)C.Anuは、機能を持っています


F X Y = X | Y - バイナリ分割でYビットは、ビットiについて見出さ

Xは、Yは、I-1の両方である場合、関数の結果のビットiが0であります

ときにi番目のビットX 0、i番目のビットが1であり、Y、関数結果がビットI 0であります

私は、xが1である場合、Y i番目のビットが0であるIビット、関数の結果は、ビットiは

 以下のためのF F ... F F A 1 A 2 A 。3 ... A N- - 1 A N- )どんなに行番号の順序私はちょうど1ビット機能≥2Nリニアi番目の演算結果後のビットが0であります 

証明:

 

1. A1 i番目のビットが0の場合に関係なく、関数計算結果のn番目の行はiが0であるビットどのようにしない場合

i番目のビットの結果の関数は、最初のケースの後に0になるように、i番目のビットa1はi番目のビット番号1の後に1秒に遭遇した2

したがって、最終的な答えは、最初の数に依存する、ビット数nに一度だけ現れる最初の数

だから、始め貪欲高いから、ほとんどに答えるために、限り、このビットは、背中のループを抜けるに一度だけ表示され、明らかに素晴らしいの位置に影響を与えなかったとして、

反射1.計算し、ハイからローへの通常貪欲最大値を、選択ビットを含む質問については、決定的スプリットビットでなければなりません  

           これは、ほんの数年程度であるが、また、ビットに応じてはなりません

         2.関数が反復時間xxを&Yと等価であるミスShabi F(F(x、y)を、Z)= X-X&Y-X&Y&Zをした結果は、2つだけの機能を反復されるどのように関係なく事実は

#include <ビット/ STDC ++ H>
 使用して 名前空間STDを、
CONST  INT N = 1E5 + 5 int型[N]と、
int型のmain(){
     int型、nは 
    cinを >> N;
    以下のためにINT iが= 1 ; I <= N; I ++)CIN >> [I]。
    int型 ANS = 0 ;
    以下のためにINT iが= 30、I> = 0 ; i-- ){
         int型 CNT = 0、POS = 0 以下のためのint型 J =1 ; jは<= N; J ++ 場合([J]&(1 << I)){ 
             CNT ++ 
             POS = J; 
         } 
         であれば(CNT == 1 ){ 
         ANS = POS。
         ブレーク;} 
    } 
    もし(ANS == 0のためのINT iは= 1 ; I <= N; I ++)COUT << [I] << '  ' { 
        COUT << [ANS] << '  ' 以下のためのint型私は= 1 ; I <= N; I ++ の場合(ANS = I)はcout << [I] <<!'  ' ; 
    } 
    戻り 0 
}

 

おすすめ

転載: www.cnblogs.com/wyh447154317/p/12289656.html
おすすめ