#1157Dはcodeforces。Ehabと期待XOR問題(构造)

トピックリンク:

http://codeforces.com/contest/1174/problem/D

質問の意味:

配列構成は、以下の条件を満足します

  • すべてのサブセグメントの彼のXOR値は、$のx $と等しくありません
  • $ 1 \ルa_iを<2 ^ n個の$

そのような配列の最大出力

データ範囲:

$ 18 \ $ 1 \ nは
、X <2 ^ {18} $ \ $ 1

分析: 

ゲームは$サブセグメント$と$サブシーケンス$を混同すると、元のサブ段落が連続していなければならない、後者のシーケンスは、不連続であってもよいです

試合の関係者は、問題の解決策を確認した後、

シーケンス仮説が$ a_iを$を設定されている、それが接頭辞とXOR $ $ B_iであります

即:$ b_i = A_1 \ bigoplus A_2 \ bigoplus A_3 \ bigoplus A_4 ..... \ bigoplus a_iを$

$ B_i $は、次の基準を満たす必要があります

  • ノー繰り返し要素、すなわち$ b_i \ NEQ b_j $
  • 排他的論理和の$ X $の値の要素のない1
  • 何の$ X $はありません

第二に、我々は$ gは$配列は、$ B $を追加した場合、$ G \ bigoplus X $ $ bは$配列ではありませんので、そのライン上のこれら2つの数のいずれかを選択することを知ることができます

$ a_iをb_i = \ oplus B_ {I-1} $ B配列を得た後

ACコード:

#include <ビット/ STDC ++ H> 
の#defineは長い長いちゃう
の#define PA対<整数、整数> 
名前空間stdを使用します。
const int型MAXN = 1E5 + 10。
const int型MAXM = 1E6 + 10。
constのLL MOD = 998244353; 
int型ANS [MAXN]。
インラインLL CAL(STをINT、INT LEN)
{ 
    リターン(LL)LEN *(2 * ST + LEN-1)/ 2。
} 
int型のmain()
{ 
    int型N、K。
    (scanf関数( "%D%dの"、&N&K)== 2)一方
    { 
        IF(CAL(1、K)> N)
        { 
            のprintf( "NOの\ n"); 
            持続する; 
        } 
        (N == 4 && K == 2)であれば
        { 
            のprintf( "NOの\ n"); 
            持続する;
        そうであれば(N == 8 && Kの== 3)
        { 
            のprintf( "NOの\ n"); 
            持続する; 
        } 
        ; ST = 1、EN = N int型 
        一方(ST = EN!)
        { 
            int型MD =(EN ST +)/ 2。
            IF(CAL(MD + 1、K)<= N)ST = MD + 1。
            他のエン= MD; 
        } 
        ため(INT i = 1; iは= Kを<; iは++)
            ANS [I] = ST + I-1。
        INT今= N-CAL(ST、K)、INDE = K。
        一方、(今)
        { 
            IF(ANS [INDE] +1 <= 2 * ANS [INDE-1])ANS [INDE] ++、INDE - 、now--。
            他のINDE = K; 
        } 
        のprintf( "YESの\ n"); 
        以下のために(INT i = 1; iは= Kを<; iは++)
        {
            printf( "%dの"、ANS [I])。
            もし(I == K)のprintf( "\ n")を。
            他のprintf(」「); 
        } 
    } 
    0を返します。
}

  

  

おすすめ

転載: www.cnblogs.com/carcar/p/10915459.html